MFC:启动摄像头

女爷i 2022-06-13 09:59 323阅读 0赞

先展示效果:

20170704164232650

启动摄像头的操作需要用到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头文件中添加打开摄像头函数声明

  1. bool OpenCamera();
  2. bool ShowVideo();
  3. IplImage* pFrame;//存储视频一帧
  4. CvCapture* pCapture;//存储视频流
  5. CRect rect;//显示区域大小
  6. CDC *pDC;
  7. HDC hDC;
  8. CWnd *pWnd;

OnInitDialog()函数中添加:

  1. pFrame = NULL;
  2. pCapture = NULL;
  3. pWnd = GetDlgItem(IDC_SHOWIMG);
  4. pDC = pWnd->GetDC();
  5. hDC = pDC->GetSafeHdc();
  6. pWnd->GetClientRect(&rect);

添加按钮响应函数及OpenCamera()和ShowVideo()的实现

  1. void CDetectDlg::OnBnClickedCam()
  2. {
  3. // TODO: 在此添加控件通知处理程序代码
  4. if (OpenCamera())
  5. {
  6. ShowVideo();
  7. }
  8. }
  9. bool CDetectDlg::OpenCamera(){
  10. if (pCapture != NULL){
  11. return true;
  12. }
  13. if(!(pCapture = cvCaptureFromCAM(0))){
  14. return false;
  15. }
  16. pFrame = cvQueryFrame(pCapture);
  17. return true;
  18. }
  19. bool CDetectDlg::ShowVideo(){
  20. pFrame = cvQueryFrame(pCapture);
  21. CvvImage m_CvvImage;
  22. m_CvvImage.CopyOf(pFrame, 1);
  23. m_CvvImage.DrawToHDC(hDC, &rect);
  24. SetTimer(1, 10, NULL);//触发一个计数器,在响应函数中完成图像显示
  25. return true;
  26. }

定时器函数:

  1. void CDetectDlg::OnTimer(UINT_PTR nIDEvent)
  2. {
  3. // TODO: 在此添加消息处理程序代码和/或调用默认值
  4. pFrame = cvQueryFrame(pCapture);
  5. CvvImage m_CvvImage;
  6. m_CvvImage.CopyOf(pFrame, 1);
  7. m_CvvImage.DrawToHDC(hDC, &rect);
  8. CDialogEx::OnTimer(nIDEvent);
  9. }

添加关闭摄像头按钮,消息函数函数,释放资源:

  1. void CDetectDlg::OnBnClickedClosecam()
  2. {
  3. // TODO: 在此添加控件通知处理程序代码
  4. if (pCapture != NULL)
  5. {
  6. cvReleaseCapture(&pCapture);
  7. KillTimer(1);
  8. }
  9. }

以上实现摄像头的创建,图像的捕获与显示。

检查了一下午仍有问题未解决,内存泄漏了,如下图

20170704170321419

参考了_CrtSetBreakAlloc(159)方法,见http://blog.csdn.net/doubleuto/article/details/5945666,仍然无法定位。希望大神指出错误,谢谢。

以上内容有任何错误,请在评论区留言交流,谢谢。

发表评论

表情:
评论列表 (有 0 条评论,323人围观)

还没有评论,来说两句吧...

相关阅读

    相关 WINCE MFC程序隐藏启动

    在MFC的示例开始会创建模态对话框,然后进行一系列的初始化.最终会在屏幕上显示对话框出来。 但有时候启动程序时,是不想见到对话框的.这种隐藏窗口方式启动方法如下 B

    相关 MFC实现程序启动动画

    我们发现很多大型程序在打开时都有一个启动界面,等过一段时间才会进入主界面,这是怎么实现的呢,我这篇文章就来简单讲一讲 说到底就是用了多线程技术,不过这里,我们有专有名词,工作