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

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

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

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

VS2013下使用OpenCV2.4.9打开摄像头并且显示_第1张图片

通过对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控件中的函数。详见我的博客  

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

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

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

 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的消息相应:
VS2013下使用OpenCV2.4.9打开摄像头并且显示_第2张图片

OnTimer消息相应函数的实现代码:
void CMFC_OpenCVtestDlg::OnTimer(UINT_PTR nIDEvent)
{
	// TODO:  在此添加消息处理程序代码和/或调用默认值
	Mat frame;
	Capture >> frame;
	img = &frame.operator IplImage();
	DrawToMFC(IDC_VIEW, img);
	CDialogEx::OnTimer(nIDEvent);
}
运行之后,成功:
VS2013下使用OpenCV2.4.9打开摄像头并且显示_第3张图片
(PS:笔者深夜写博客儿,有台灯灯光,面容狰狞,切掉!!!勿怪!!!)

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

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

你可能感兴趣的:(图像处理,MFC学习,OpenCV,opencv实践)