VS2013下使用OpenCV2.4.9打开摄像头并且显示

悠悠 2022-08-09 12:57 409阅读 1赞

笔者最近一直在使用OpenCV做一个图像处理的实例程序,在实际的过程中肯定会遇到很多问题,由于是新手,因此遇到问题更多的是参考别人的博客,然后针对自己的错误,进行改正,可能很多问题知其然,而不知其所以然。但是本着学习的心态,希望最后的解决方案能够帮助后来学习的人能够解决这个问题,至于深层次的原因可以一起讨论和研究学习。

如图所见,笔者的开发环境是VS2013+OpenCV2.4.9,相比于很多的博客(都是VC6.0+OpenCV1.0),可以借鉴和参考。下面介绍最开始出bug的做法以及改正后的做法。

最开始的做法:
在进行调用摄像头的时候,笔者的界面如图:

20151024233130980

通过对Capture为“打开摄像头”的按钮添加相应的处理函数:

  1. void CMFC_OpenCVtestDlg::OnOpenCamera()
  2. {
  3. VideoCapture Capture(0);
  4. Mat frame;
  5. while (1)
  6. {
  7. Capture >> frame;
  8. if (frame.rows==0)
  9. img = &frame.operator IplImage();
  10. DrawToMFC(IDC_VIEW, img);
  11. waitKey(30);
  12. }

其中DrawToMFC是一个在OpenCV2.4.9下实现将opencv图像数据显示到picture控件中的函数。详见我的博客

关于OpenCV中rectangle函数的使用+统计直方图(地址:点击打开链接)。这样处理,可以在控件上短时间的显示图像,但是过一会儿就会发生错误,但是将DrawToMFC改成imshow()函数(opencv自带的显示图像函数)就完全没有问题,然后就找各种解释,调试看看了一下变量的地址以及赋值情况,按理是应该可以显示的。但是最后没有成功找出问题之所在,所以不得不另寻他法。

于是看了网上很多的资料,参考了一下,有直接调用windows系统下的API函数实现的,这个我早期用过,确实可行。同时本着尽量使用opencv运用于MFC上的目的,决定采用的第二种方案,也就是通过设置定时器来实现。

可行方案:

由于涉及到定时器,以及定时器的相应函数,VideoCapture类必须被两种成员方法所调用,因此将VideoCapture类设置为了我的主对话框CMFC_OpenCVtestDlg类的成员变量:

  1. public:
  2. VideoCapture Capture;

然后对 Capture为“打开摄像头”的按钮的处理函数进行修改:

  1. void CMFC_OpenCVtestDlg::OnOpenCamera()
  2. {
  3. // TODO: 在此添加控件通知处理程序代码
  4. Capture.open(0);
  5. Mat frame;
  6. img = &frame.operator IplImage();
  7. DrawToMFC(IDC_VIEW,img);
  8. SetTimer(1, 10, NULL);
  9. /*while (1)
  10. {
  11. Capture >> frame;
  12. if (frame.rows==0)//-----------------------------没有if语句会报错
  13. continue;
  14. img = &frame.operator IplImage();
  15. DrawToMFC(IDC_VIEW, img);
  16. waitKey(30);
  17. }*/
  18. }

建立定时器Timer的消息相应:

20151025002821164

OnTimer消息相应函数的实现代码:

  1. void CMFC_OpenCVtestDlg::OnTimer(UINT_PTR nIDEvent)
  2. {
  3. // TODO: 在此添加消息处理程序代码和/或调用默认值
  4. Mat frame;
  5. Capture >> frame;
  6. img = &frame.operator IplImage();
  7. DrawToMFC(IDC_VIEW, img);
  8. CDialogEx::OnTimer(nIDEvent);
  9. }

运行之后,成功:

20151025003225157

(PS:笔者深夜写博客儿,有台灯灯光,面容狰狞,切掉!!!勿怪!!!)

(PS:希望大牛们看见我的博客,愿意一起把最开始的问题之所在解决的私信我咯!!!!)

(PS:程序中的img也是主对话框的成员变量,用于方便在在各个成员方法中处理图片,类型为IplImage *img);

发表评论

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

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

相关阅读

    相关 vs2013使用opencv静态库

    使用VS2013和opencv进行图像处理程序的开发,当把程序放到一台没有安装opencv的电脑上运行的时候,需要重新安装opencv程序才能运行,这样会显得很麻烦,使用ope

    相关 opencv2+opencv3+VS2013

            由于高版本软件内容丰富且源代码优化便于操作,但是也往往舍弃低版本某些库文件。opencv3中库文件中丢掉了opencv\_nonfree2410d.lib 文件