在MFC对话框的控件中显示Opencv摄像头视频+Camshift跟踪算法实现
2010-05-07 16:31
一般用opencv显示视频,都用cvNamedWindow新建窗口,并且在while循环中更新每一帧视频,由于窗口是opencv自己创建的,所以在VC中很难对其进行控制,出于这个目的,希望能将视频显示在VC能够控制的部件中。这里给出一个实例说明如何在MFC对话框的picture控件中显示摄像头视频。
主要步骤为:
1.建立对话框工程并设置对话框布局
注意对话框中间的是picture控件用于显示视频。
2.和console的程序一样,设置opencv库环境,加入opencv头文件,并定义所需要的变量。
3.关键的是这一步,定义CvvImage类型的变量m_CvvImage,这个类型的变量里有函数DrawToHDC能在MFC的控件中显示视频。
还有一个关键的一步是设置定时器timer,MFC中不用while循序来更新每帧视频,取而代之的是在定时器timer的响应函数中实现视频的更新,在本程序中每100毫秒进入一次定时器,定时器响应时间可以更改。
这里给出“打开摄像头”和定时器timer的响应函数。
01void COpencvUIDlgDlg::OnOpencamera() //打开摄像头按钮的响应函数
02{
03// TODO: Add your control notification handler code here
04m_Video=cvCreateCameraCapture(-1);//打开摄像头
05
06if (!m_Video)
07return;
08
09SetTimer(1,100,NULL);//设置定时器
10}
11
12void COpencvUIDlgDlg::OnTimer(UINT nIDEvent) //定时器的响应函数
13{
14// TODO: Add your message handler code here and/or call default 15// KillTimer(nIDEvent);
16m_Frame=cvQueryFrame(m_Video);//m_Frame是IplImage指针类型
17m_CvvImage.CopyOf(m_Frame,1);//m_CvvImage是CvvImage类型
18m_CvvImage.DrawToHDC(hDC,&rect);
19//将CvvImage显示在picture控件中,hDC是picture控件的句柄.rect是picture的区域.
20b_flagProcess=1;
21
22CDialog::OnTimer(nIDEvent);
23}
4.加入截图和保存视频功能。
本程序下载地址:https://www.sodocs.net/doc/6b937586.html,/source/1617588
---------------------------------------------------------------------------------------------------------------------------------
可以对本程序进行二次开发,下面实现在上述程序的基础上实现Camshift跟踪算法。
Opencv中自带Camshift跟踪算法的实现(OpenCV\samples\c\camshiftdemo.c),不过是基于console的,在MFC中实现则不能用其本来的鼠标回调函数来定位目标,而要改用MFC的鼠标消息响应函数。
运行结果为:
本程序下载地址:https://www.sodocs.net/doc/6b937586.html,/source/1617559