MFC:启动摄像头
先展示效果:
启动摄像头的操作需要用到opencv的库,本文用的是opencv2.4.9
配置opencv环境,参见:http://jingyan.baidu.com/article/75ab0bcbee4b47d6864db2fc.html
需要用到CvvImage类,opencv2.4.9里面没有这个类,需要手动添加,关于CvvImage类的说明请看:
http://blog.csdn.net/weixingstudio/article/details/7357651
http://blog.csdn.net/weixingstudio/article/details/7357558
需要注意:
(1)cvCaptureFromCAM(0)函数可以创建摄像头,网上说参数可以使用-1,但经过实验,至少在我的电脑上参数-1采集图像无法正常工作。
(2)SetTimer()定时器函数,MFC中定时器的使用大家参见网上资料http://baike.baidu.com/item/SetTimer或http://www.cnblogs.com/lidabo/archive/2012/06/28/2568628.html。通过类向导添加定时器消息WM\_TIMER和添加消息响应函数OnTimer
(3)如果使用while循环实现显示图像功能,其他功能键将无法使用,所以最好是使用定时器方法每个几毫秒更新一次图像。
添加一个打开摄像头的按钮button,显示控件picture control,ID更名为IDC_SHOWIMG。在DetectDlg.h头文件中添加打开摄像头函数声明
bool OpenCamera();
bool ShowVideo();
IplImage* pFrame;//存储视频一帧
CvCapture* pCapture;//存储视频流
CRect rect;//显示区域大小
CDC *pDC;
HDC hDC;
CWnd *pWnd;
OnInitDialog()函数中添加:
pFrame = NULL;
pCapture = NULL;
pWnd = GetDlgItem(IDC_SHOWIMG);
pDC = pWnd->GetDC();
hDC = pDC->GetSafeHdc();
pWnd->GetClientRect(&rect);
添加按钮响应函数及OpenCamera()和ShowVideo()的实现
void CDetectDlg::OnBnClickedCam()
{
// TODO: 在此添加控件通知处理程序代码
if (OpenCamera())
{
ShowVideo();
}
}
bool CDetectDlg::OpenCamera(){
if (pCapture != NULL){
return true;
}
if(!(pCapture = cvCaptureFromCAM(0))){
return false;
}
pFrame = cvQueryFrame(pCapture);
return true;
}
bool CDetectDlg::ShowVideo(){
pFrame = cvQueryFrame(pCapture);
CvvImage m_CvvImage;
m_CvvImage.CopyOf(pFrame, 1);
m_CvvImage.DrawToHDC(hDC, &rect);
SetTimer(1, 10, NULL);//触发一个计数器,在响应函数中完成图像显示
return true;
}
定时器函数:
void CDetectDlg::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
pFrame = cvQueryFrame(pCapture);
CvvImage m_CvvImage;
m_CvvImage.CopyOf(pFrame, 1);
m_CvvImage.DrawToHDC(hDC, &rect);
CDialogEx::OnTimer(nIDEvent);
}
添加关闭摄像头按钮,消息函数函数,释放资源:
void CDetectDlg::OnBnClickedClosecam()
{
// TODO: 在此添加控件通知处理程序代码
if (pCapture != NULL)
{
cvReleaseCapture(&pCapture);
KillTimer(1);
}
}
以上实现摄像头的创建,图像的捕获与显示。
检查了一下午仍有问题未解决,内存泄漏了,如下图
参考了_CrtSetBreakAlloc(159)方法,见http://blog.csdn.net/doubleuto/article/details/5945666,仍然无法定位。希望大神指出错误,谢谢。
以上内容有任何错误,请在评论区留言交流,谢谢。
还没有评论,来说两句吧...