配色检测

1、在StdAfx.h中加入

#include <vfw.h>

#pragma comment(lib,"vfw32.lib")

#define NAME  “图.bmp”

在能显示的类中加入成员变量

         HWNDghWndCap;// 视频窗口的句柄

         CAPDRIVERCAPSgCapDriverCaps;// 捕捉驱动程序的信息结构体

定义图像设备接口, 在StdAfx.h中加入

#include <gdiplus.h>

#pragma comment(lib, "gdiplus.lib")

using namespace Gdiplus;

在WinApp的类中加入成员变量

     private:

     GdiplusStartupInputgdiplusStartupInput;//图像输入变量

     ULONG_PTR gdiplusToken;//存图像设备结构体

在WinApp的类的InitInstance()中加入

GdiplusStartup(&gdiplusToken,&gdiplusStartupInput, NULL);//初始化图像设备

在WinApp的类的ExitInstance()中加入

     GdiplusShutdown(gdiplusToken);//删除存图像设备结构体

 

构造的类

class CCamera

{

public:

//摄像头初始化

void InitCamera(HWND VideoHwnd,intIndex=0);//          以要在显示的窗口句柄VideoHwnd为参数,index是显示哪个摄像头(目前只一个),0为默认,, 函数放在初始化函数中

//显示视频

void ShowVideo(int Index,int v=66);//设置显示哪个, 配置显示速率(默认是66)和显示模式并显示

//获得图像

BYTE*  GetImage(int Index); //得到图像缓存形式

//初始化图像采集卡

void InitCard();

protected:

UINT Width;

     UINT Height;

     HWND ghWndCap;

     CAPDRIVERCAPS gCapDriverCaps;

};

void CCamera::InitCamera(HWNDVideoHwnd,int Index=0)

{

         ghWndCap=capCreateCaptureWindow((LPSTR)"Capture Window",WS_CHILD|WS_VISIBLE,0,0,300,240,(HWND)VideoHwnd,(int)0);

         //capSetCallbackOnError(ghWndCap,(FARPROC)ErrorCallbackProc);

         //capSetCallbackOnStatus(ghWndCap,(FARPROC)StatusCallbackProc);

         //capSetCallbackOnFrame(ghWndCap,(FARPROC)FrameCallbackProc);

         capDriverConnect(ghWndCap,0);//连接视频

         capDriverGetCaps(ghWndCap,&gCapDriverCaps,sizeof(CAPDRIVERCAPS));//保存视频信息

}

void CCamera::ShowVideo(int Index,intv)

{

         capPreviewRate(ghWndCap,v);// 设置Preview模式的显示速率

         capPreview(ghWndCap,TRUE); //启动Preview模式

         if(gCapDriverCaps.fHasOverlay) //检查驱动器是否有叠加能力

         capOverlay(ghWndCap,TRUE);//启动Overlay模式

}

BYTE*  CCamera::GetImage(intIndex,)

{

     capGrabFrame(ghWndCap);//捕捉当前帧

     capFileSaveDIB(ghWndCap,”tu.bmp” );//存图

 

//把图变成缓存形式

     Bitmap map(“tu.bmp”);

     Width=map.GetWidth();

     Height=map.GetHeight();

     BYTE * BitmapBuf=new BYTE[Height*3*Width];

     memset(BitmapBuf,255,Height*3*Width);

     BitmapData tempdata;

     Rect rect(0, 0, map.GetWidth(),map.GetHeight());

     map.LockBits(&rect,ImageLockModeRead,PixelFormat24bppRGB,&tempdata);

     BYTE* pBitmapStart =(BYTE*)tempdata.Scan0;

     pBitmapStart =(BYTE*)tempdata.Scan0;

     memcpy_s(BitmapBuf,Height*3*Width,pBitmapStart,Height*3*Width);

     map.UnlockBits(&tempdata);

 

return BitmapBuf;

}

 

 

class CImage

{

public:

       //得到二进制的图像

       BYTE * GetBuffer();

       //得到图像宽带

       long  GetWidth();

    //得到图像高度

       long  GetHeight();

    //得到跨度

       long  GetStride();

    //图像类初始化

       CImage(long Width,longHeight,long Stride, BYTE * ImageBuffer;)

//图像类初始化

{//赋值

       m_ImageWidth=Width;

       m_ImageHeight=Height;

       m_ImageStride=Stride;

       m_ImageBuffer= ImageBuffer;

}

 

    //删除图像类操作

~CImage()

{}

protected:

       BYTE *  m_ImageBuffer;//图像缓冲

       long m_ImageWidth;//图像宽度

       long m_ImageHeight;//图像高度

       long m_ImageStride;//图像边界

};

BYTE * CImage::GetBuffer()//得到二进制的图像

{

       return m_ImageBuffer;//返回二进制的图像

}

long CImage::GetWidth()//得到图像宽带

{

       return m_ImageWidth; //返回图像宽带

}

long CImage::GetHeight()//得到图像高度

{

       return m_ImageHeight; //返回图像高度

}

long CImage::GetStride()//得到跨度

{

       return m_ImageStride; //返回跨度

}

构造处理类

class CImageAlgorithm

{

public:

       CImageAlgorithm(CImage im);//初始化RGB

       TRIVALGetTristimulusValues();// 获得三刺激值

       float Getcolor (LAB  Lab);//获取色差

       LAB GetLab(TRIVAL TriVal1,TRIVAL TriValn); //得到颜色空间

       TRIVALChromaticityCoordinates(TRIVAL TriVal);//把色品坐标当做

三刺激值

       int GetR();//得到R值

       int GetG();//得到G值

       int GetB();//得到B值

void SetRBG();

void SetLightRBG();

void CImageAlgorithm:: AveRGB()//求平均RBG

protected:

       long m_R;//图像R值

       long m_G;//图像G值

       long m_B;//图像B值

CImage image;

};

void SetRBG()

{}

void SetLightRBG();

{}

CImageAlgorithm::CImageAlgorithm(CImageim)

{

image = im;

}

void CImageAlgorithm:: AveRGB()

{

       BYTE*Start = (BYTE*) ImageBuffer;//获得图像起始位置

       long Rn=0,Gn=0,Bn=0;//初始化R,G,B各自的总和

       for (UINT i=0; i<Height;i++)

       {

              for (UINT j=0;j<Width; j++)

              {

                     Gn=Gn+*(Start+i*Stride+j*3);//求G总和

                     Bn=Bn+*(Start+i*Stride+j*3+1);// 求B总和

                     Rn=Rn+*(Start+i*Stride+j*3+2);// 求R总和

              }

       }

       m_R=Rn/(Width*Height);//把R值总和给m_R

       m_G=Gn/(Width*Height);//把G值总和m_G

       m_B=Bn/(Width*Height); //把B值总和m_B

}

float CImageAlgorithm::Getcolor (LAB Lab)

{

       int L=Lab.L,a=Lab.a,b=Lab.b;//赋值

       float E = (L*L + a*a + b*b)/2;//求色差

       return E;//返回色差

}

TRIVAL CImageAlgorithm::GetTristimulusValues()

{

       int R=m_R,G=m_G,B=m_B;//赋值

       TRIVAL   TriVal;//创造三刺激值结构体对象

 

       //求三刺激值

       TriVal.X = 2.7689 * R + 1.7517* G + 1.1302 * B;//求三刺激值中

的X

       TriVal.Y= R + 4.5904 * G + 0.0601 * B;// 求三刺激值中的Y

       TriVal.Z = 0.0565 * R + 5.5943* B;// 求三刺激值中的Z

       return TriVal;//返回三刺激值结构体

}

LAB CImageAlgorithm::GetLab(TRIVAL TriVal1, TRIVAL TriValn)

{//赋值

       float X=TriVal1.X;

       float Y=TriVal1.Y;

       float Z= TriVal1.Z;

       float Xn=TriValn.X;

       float Yn=TriValn.Y;

       float Zn=TriValn.Z;

       LAB Lab; //创造颜色空间结构体对象

 

       //求颜色空间的L,a,b

       Lab.L = 116 * (Y / Yn) * 1 / 3- 16;

       Lab.a = 500 * ((X / Xn) * 1 /3 -(Y / Yn) * 1 / 3);

       Lab.b = 200 * ((Y / Yn) * 1 /3 -(Z / Zn) * 1 / 3);

       return Lab;

}

int CImageAlgorithm::GetR()//得到R值

{

       return m_R; //返回R值

}

int CImageAlgorithm::GetG()//得到G值

{

       return m_G; //返回G值

}

int CImageAlgorithm::GetB()//得到B值

{

       return m_B; //返回B值

}

//把色品坐标当做三刺激值

TRIVAL CImageAlgorithm::ChromaticityCoordinates(TRIVAL  TriVal)

{//赋值

       TRIVAL  TriVal1;

       float X=TriVal.X;

       float Y=TriVal.Y;

       float Z= TriVal.Z;

 

       float x,y,z;

       //求色品坐标值x , y , z

       x =X/(X + Y + Z);

       y =Y/(X + Y + Z);

       z =Z/(X + Y + Z);

 

       //赋值给三刺激值结构体

       TriVal1 .X=x;

       TriVal1.Y=y;

       TriVal1 .Z=z;

       return TriVal1;// 返回三刺激值结构体

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值