VisualStudio2010在MFC中用opencv实现对视频中动态目标的追踪第二步,建立一个MFC的对话框程序,做两个按钮,一个“打开视频文件”,一个“运动跟踪处理”。具体操作:1建立MFC对话框程序的框架:File-New-MFCAppWizard(exe),选取工程路径,并取工程名“VideoProcesssing”-Next-选择Dialogbased后,去掉使用Unicode库的勾,选择在静态库中使用MFC,点Finish,点OK.2添加按钮:直接Delete掉界面默认的两个“确定”“取消”按钮。然后添加两个button,分别名为“打开视频”,“运动跟踪处理”,其ID分别设为IDC_OPEN_VIDEO,IDC_TRACKING.3添加消息响应函数:双击按钮“打开视频文件”,自动生成响应函数名OnOpenVideo,点Ok。然后添加如下代码:CFileDialogdlg(true,*.avi,NULL,NULL,*.avi|*.avi||);if(dlg.DoModal()==IDOK){strAviFilePath=dlg.GetPathName();}else{return;}同样,双击“运动跟踪处理”按钮,选择默认的响应函数名,然后添加代码://声明IplImage指针IplImage*pFrame=NULL;IplImage*pFrImg=NULL;IplImage*pBkImg=NULL;CvMat*pFrameMat=NULL;CvMat*pFrMat=NULL;CvMat*pBkMat=NULL;CvCapture*pCapture=NULL;intnFrmNum=0;//打开AVI视频文件if(strAviFilePath==)//判断文件路径是否为空{MessageBox(请先选择AVI视频文件!);return;}else{if(!(pCapture=cvCaptureFromFile(strAviFilePath))){MessageBox(打开AVI视频文件失败!);return;}}//创建窗口cvNamedWindow(Video,1);cvNamedWindow(Background,1);cvNamedWindow(Foreground,1);//使窗口有序排列,窗口宽330cvMoveWindow(Video,30,0);cvMoveWindow(Background,360,0);cvMoveWindow(Foreground,690,0);//逐帧读取视频while(pFrame=cvQueryFrame(pCapture)){nFrmNum++;//如果是第一帧,需要申请内存,并初始化if(nFrmNum==1){pBkImg=cvCreateImage(cvSize(pFrame-width,pFrame-height),IPL_DEPTH_8U,1);//存放背景图像(灰度)pFrImg=cvCreateImage(cvSize(pFrame-width,pFrame-height),IPL_DEPTH_8U,1);//存放中间图像(灰度)pBkMat=cvCreateMat(pFrame-height,pFrame-width,CV_32FC1);pFrMat=cvCreateMat(pFrame-height,pFrame-width,CV_32FC1);pFrameMat=cvCreateMat(pFrame-height,pFrame-width,CV_32FC1);//转化成单通道图像再处理(灰度)cvCvtColor(pFrame,pBkImg,CV_BGR2GRAY);cvCvtColor(pFrame,pFrImg,CV_BGR2GRAY);cvConvert(pFrImg,pFrameMat);cvConvert(pFrImg,pFrMat);cvConvert(pFrImg,pBkMat);}else{cvCvtColor(pFrame,pFrImg,CV_BGR2GRAY);//转化成单通道图像再处理(灰度)cvConvert(pFrImg,pFrameMat);//高斯滤波先,以平滑图像//cvSmooth(pFrameMat,pFrameMat,CV_GAUSSIAN,3,0,0);//当前帧跟背景图相减(求背景差并取绝对值)cvAbsDiff(pFrameMat,pBkMat,pFrMat);//二值化前景图(这里采用特定阈值进行二值化)cvThreshold(pFrMat,pFrImg,60,255.0,CV_THRESH_BINARY);//进行形态学滤波,去掉噪音cvErode(pFrImg,pFrImg,0,1);cvDilate(pFrImg,pFrImg,0,1);//滑动平均更新背景(求平均)cvRunningAvg(pFrameMat,pBkMat,0.003,0);//将背景转化为图像格式,用以显示cvConvert(pBkMat,pBkImg);//保持原图像的旋转方向pBkImg-origin=pFrImg-origin=pFrame-origin;//显示图像cvShowImage(Video,pFrame);cvShowImage(Background,pBkImg);cvShowImage(Foreground,pFrImg);//如果有按键事件,则跳出循环//此等待也为cvShowImage函数提供时间完成显示//等待时间可以根据CPU速度调整if(cvWaitKey(200)=0)break;}}//销毁窗口cvDestroyWindow(Video);cvDestroyWindow(Background);cvDestroyWindow(Foreground);//释放图像和矩阵cvReleaseImage(&pFrImg);cvReleaseImage(&pBkImg);cvReleaseMat(&pFrameMat);cvReleaseMat(&pFrMat);cvReleaseMat(&pBkMat);cvReleaseCapture(&pCapture);4选fileview选项卡中VideoProcessingDlg.h,在CVideoProcessingDlg类中添加公有类成员:CStringstrAviFilePath;5选fileview选项卡中VideoProcessingDlg.cpp,添加opencv头文件#includecv.h#includehighgui.h#includecxcore.h6编译执行,成功!还可以添加一个”录制视频”的按钮,修改ID号为IDC_RECORD,双击“录制视频”按钮,选择默认的响应函数名,然后添加代码:CvCapture*capture=cvCaptureFromCAM(-1);//打开摄像头CvVideoWriter*video=NULL;IplImage*frame=NULL;intn;if(!capture)//如果不能打开摄像头给出警告{coutCannotopenthecamera.endl;return;}else{frame=cvQueryFrame(capture);//首先取得摄像头中的一帧video=cvCreateVideoWriter(camera.avi,CV_FOURCC('X','V','I','D'),25,cvSize(frame-width,frame-height));//创建CvVideoWriter对象并分配空间//保存的文件名为camera.avi,编码要在运行程序时选择,大小就是摄像头视频的大小,帧频率是32if(video)//如果能创建CvVideoWriter对象则表明成功{coutVideoWriterhascreated.endl;}cvNamedWindow(CameraVideo,1);//新建一个窗口inti=0;while(i=200)//让它循环200次自动停止录取{frame=cvQueryFrame(capture);//从CvCapture中获得一帧if(!frame){coutCannotgetframefromthecapture.endl;break;}n=cvWriteFrame(video,frame);//判断是否写入成功,如果返回的是1,表示写入成功coutnendl;cvShowImage(CameraVideo,frame);//显示视频内容的图片i++;if(cvWaitKey(2)0)break;//有其他键盘响应,则退出}cvReleaseVideoWriter(&video);cvReleaseCapture(&capture);cvDestroyWindow(CameraVideo);}return;第二步,建立一个编程环境,然后加载opencv的库路径等等。具体步骤如下。PATHD:\OpenCV2.3.1\buildOPENCVD:\OpenCV2.3.1\build\x86\vc10\bin如下图所示。配置VS2010,选择“视图”——“其他窗口”——“属性管理器”,如下图所示。双击Debug|Win32下的“Microsoft.Cpp.Win32.user”,如下图所示。在弹出的配置框中配置,选择“VC++目录”。1、在“包含目录”中的结尾处(若结尾处无英文状态下的“;”则需自行添加“;”,下同)加入以下内容添加以下内容:$(opencv)\include\opencv;$(opencv)\include\opencv2;$(opencv)\include;2、在库目录中的结尾处加入以下内容添加:$(opencv)\x86\vc10\lib;注:$(opencv)\include\opencv是告诉VC去“opencv”这个变量中的文件夹下的\include\opencv路径中找OpenCV的库文件目录。如下图所示。在“链接器”-“输入”-“附加依赖选项”中的结尾处加入以下内容:$(opencv)\x86\vc10\lib\opencv_core231d.lib;$(opencv)\x86\vc10\lib\opencv_highgui231d.lib;$(opencv)\x86\vc10\lib\opencv_video231d.lib;$(opencv)\x86\vc10\lib\opencv_ml231d.lib;$(opencv)\x86\vc10\lib\opencv_legacy231d.lib;$(opencv)\x86\vc10\lib\opencv_imgproc231d.lib;注:lib可根据实际情况进行删减。如下图所示。点击确定,至此OpenCV的配置完成。第三步,编译,然后调试运行,运行截图如下: