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