MFC利用OpenCV读取摄像头

  • Post author:
  • Post category:其他


一,引言



在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 版权协议,转载请附上原文出处链接和本声明。