[转]手把手教你用MFC做个opencv动态跟踪的小例子2017-07-20 16:53:01

( 1人已投票,[高质量] )
分享:
31.3K

第一步,是要建立一个编程环境,然后加载opencv的库路径等等。具体步骤在 http://www.opencv.org.cn/ 安装
有详细介绍。


第二步,建立一个MFC的对话框程序,做两个按钮,一个打开视频文件,一个运动跟踪处理
具体操作:
1 建立MFC对话框程序的框架:File  ->New  -> MFC AppWizard(exe),选取工程路径,并取工程
“VideoProcesssing”-> Next -> 选择Dialog based后,点Finish,OK.
2 添加按钮:直接Delete掉界面默认的两个确定”“取消按钮。然后添加两个button,分别名为打开视频运动
跟踪处理,其ID分别设为IDC_OPEN_VIDEOIDC_TRACKING.
3 添加消息响应函数:双击按钮打开视频,自动生成响应函数名OnOpenVideo,点Ok。然后添加如下代码:

CFileDialog dlg(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;

int nFrmNum = 0;

//打开AVI视频文件
if(strAviFilePath=="")  //判断文件路径是否为空
{
 MessageBox("请先选择AVI视频文件!");
 return;
}else
{
 if(!(pCapture = cvCaptureFromFile(strAviFilePath)))
 {
  MessageBox("打开AVI视频文件失败!");
  return;
 }
}
//创建窗口
cvNamedWindow("Video", 1);
cvNamedWindow("Background",1);
cvNamedWindow("Foreground",1);

//使窗口有序排列,窗口宽330
cvMoveWindow("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类中添加公有类成员:
CString  strAviFilePath;
5 fileview选项卡中VideoProcessingDlg.cpp,添加opencv头文件
#include "cv.h"
#include "highgui.h"
#include "cxcore.h"
6 点击Project——settings——link——Object/library modules下填入
cxcore.lib cv.lib cvaux.lib highgui.lib cvcam.lib ml.lib
7 编译执行,成功!





头像

snowcoal
  • opencv
  • mfc

本文标签:

opencvmfc

收藏到我的私密空间

标题:[转]手把手教你用MFC做个opencv动态跟踪的小例子

作者:米纳思娃

你暂未登录,请登录后才可收藏至您的私密空间 确认取消
雪炭网

键盘操作 更便捷 -雪炭网雪中送炭-乐趣无限

如果本站的内容有幸帮助到了您,建议您了解一下当页的广告内容哦,我们的进步离不开您的支持,Thank you~