⽤mfc做⽬标跟踪界⾯
在MFC对话框的控件中显⽰Opencv摄像头视频+Camshift跟踪算法实现 ⼀般⽤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的响应函数。
01 void COpencvUIDlgDlg::OnOpencamera() //打开摄像头按钮的响应函数
02 {
03 // TODO: Add your control notification handler code here
卫生间新型地漏04 m_Video=cvCreateCameraCapture(-1);//打开摄像头
05
06 if (!m_Video)
07 return;半夏去皮机
08
两相流闸阀09 SetTimer(1,100,NULL);//设置定时器
10 }
11usb转并口
12 void COpencvUIDlgDlg::OnTimer(UINT nIDEvent) //定时器的响应函数
13 {
14 // TODO: Add your message handler code here and/or call default
15 // KillTimer(nIDEvent);
16 m_Frame=cvQueryFrame(m_Video);//m_Frame是IplImage指针类型
17 m_CvvImage.CopyOf(m_Frame,1);//m_CvvImage是CvvImage类型
18 m_CvvImage.DrawToHDC(hDC, &rect);
19 //将CvvImage显⽰在picture控件中,hDC是picture控件的句柄.rect是picture的区域.
20 b_flagProcess=1;
21
22 CDialog::OnTimer(nIDEvent);
23 }
4.加⼊截图和保存视频功能。
本程序下载地址:
---------------------------------------------------------------------------------------------------------------------------------
可以对本程序进⾏⼆次开发,下⾯实现在上述程序的基础上实现Camshift跟踪算法。
Opencv中⾃带Camshift跟踪算法的实现(OpenCV\samples\c\camshiftdemo.c),不过是基于console的,在MFC中实现则不能⽤其本来的⿏标回调函数来定位⽬标,⽽要改⽤MFC的⿏标消息响应函数。
运⾏结果为:
本程序下载地址:
编译环境:winxp vc6.0 需opencv库⽀持
camshift算法的原理见: