笔者最近一直在使用OpenCV做一个图像处理的实例程序,在实际的过程中肯定会遇到很多问题,由于是新手,因此遇到问题更多的是参考别人的博客,然后针对自己的错误,进行改正,可能很多问题知其然,而不知其所以然。但是本着学习的心态,希望最后的解决方案能够帮助后来学习的人能够解决这个问题,至于深层次的原因可以一起讨论和研究学习。
如图所见,笔者的开发环境是VS2013+OpenCV2.4.9,相比于很多的博客(都是VC6.0+OpenCV1.0),可以借鉴和参考。下面介绍最开始出bug的做法以及改正后的做法。
最开始的做法:
在进行调用摄像头的时候,笔者的界面如图:
通过对Capture为“打开摄像头”的按钮添加相应的处理函数:
void CMFC_OpenCVtestDlg::OnOpenCamera() { VideoCapture Capture(0); Mat frame; while (1) { Capture >> frame; if (frame.rows==0) img = &frame.operator IplImage(); DrawToMFC(IDC_VIEW, img); waitKey(30); }其中DrawToMFC是一个在OpenCV2.4.9下实现将opencv图像数据显示到picture控件中的函数。详见我的博客
public: VideoCapture Capture;然后对 Capture为“打开摄像头”的按钮的处理函数进行修改:
void CMFC_OpenCVtestDlg::OnOpenCamera() { // TODO: 在此添加控件通知处理程序代码 Capture.open(0); Mat frame; img = &frame.operator IplImage(); DrawToMFC(IDC_VIEW,img); SetTimer(1, 10, NULL); /*while (1) { Capture >> frame; if (frame.rows==0)//-----------------------------没有if语句会报错 continue; img = &frame.operator IplImage(); DrawToMFC(IDC_VIEW, img); waitKey(30); }*/ }建立定时器Timer的消息相应:
void CMFC_OpenCVtestDlg::OnTimer(UINT_PTR nIDEvent) { // TODO: 在此添加消息处理程序代码和/或调用默认值 Mat frame; Capture >> frame; img = &frame.operator IplImage(); DrawToMFC(IDC_VIEW, img); CDialogEx::OnTimer(nIDEvent); }运行之后,成功: