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;// 返回三刺激值结构体
}