一,引言
    
    
    在MFC中利用OpenCV可以很方便的实现摄像头视频的播放,对于从摄像头中读取到的图片,可以利用MFC中的CImage类很好的呈现在MFC界面上。
   
二,实验环境
VS版本:VS2013
OpenCVC库版本:OpenCV2.3.1
三,实现步骤
1.首先采用VS2013新建基于对话框的MFC应用程序
2.添加Picture Control,用于显示从摄像头中读取的图片
3.在对话框头文件中添加如下成员变量
	VideoCapture	m_videoCp;//用于获取摄像头设备
	Mat		m_frame;//用于读取摄像头中图片
	CImage		m_img;//用于MFC显示图片4.添加定时器
5.在OnInitDialog()中添加如下实现代码
	m_videoCp.open(0);
	if (m_videoCp.isOpened())
	{
		m_videoCp.read(m_frame);
		m_blOpen = TRUE;//代表摄像头打开成功
		Invalidate(FALSE);
		SetTimer(1,100,NULL);//启动定时器,定时从摄像头中读取图片
	}6.定时器OnTimer(UINT_PTR nIDEvent)中添加如下代码
	switch (nIDEvent)
	{
	case 1:
		if (m_videoCp.isOpened())
		{
			m_videoCp.read(m_frame);
			Mat2CImage(m_frame,m_img);//将图片由Mat类型转为CIMAGE类型
			Invalidate(FALSE);
		}
	default:
		break;
	}7.在OnPaint()中添加显示图片代码
		if (!m_img.IsNull())
		{
			CWnd* pWnd = GetDlgItem(IDC_STATIC);//IDC_STATIC为Picture Control ID
			CRect rect;
			CDC* pDC = pWnd->GetDC();
			pWnd->GetClientRect(&rect);
			pDC->SetStretchBltMode(STRETCH_HALFTONE);
			m_img.Draw(pDC->m_hDC,rect);
			ReleaseDC(pDC);
			m_img.Destroy();
		}8.Mat类型转换CImage类型函数
void Mat2CImage(Mat &mat,CImage &cImage)
{
	int	width = mat.cols;
	int height = mat.rows;
	int channels = mat.channels();
	cImage.Destroy();
	cImage.Create(width,height,8*channels);
	UCHAR* ps;
	UCHAR* pimg = (UCHAR*)cImage.GetBits();	//the pointer to storage area
	int step = cImage.GetPitch();		
	if (1 == channels)
	{
		RGBQUAD* ColorTable;
		int maxColors = 256;
		ColorTable = new RGBQUAD[maxColors];
		cImage.GetColorTable(0,maxColors,ColorTable);
		for (int i=0;i<maxColors;i++)
		{
			ColorTable[i].rgbBlue = (BYTE)i;
			ColorTable[i].rgbGreen = (BYTE)i;
			ColorTable[i].rgbRed = (BYTE)i;
		}
		cImage.SetColorTable(0,maxColors,ColorTable);
		delete [] ColorTable;
	}
	for (int i=0;i<height;i++)
	{
		ps = mat.ptr<UCHAR>(i);
		for (int j=0;j<width;j++)
		{
			if (1 == channels)
			{
				*(pimg + i*step + j) = ps[j];
			}
			else if (3 == channels)
			{
				*(pimg + i*step + j*3) = ps[j*3];
				*(pimg + i*step + j*3+1) = ps[j*3+1];
				*(pimg + i*step + j*3 + 2) = ps[j*3 +2];
			}
		}
	}
}9.最后在OnDestroy()中释放摄像即可。
最终效果图如下
    
 
版权声明:本文为fandongguang0702原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
