MFC+OPENCV

 

http://blog.csdn.net/chenyusiyuan/article/details/4744097

http://blog.csdn.net/yang_xian521/article/details/7050398

http://blog.sina.com.cn/s/blog_661159d50100id86.html

opencv [c 版] 学习笔记(2) 在MFC基于对话框界面上播放视频

弄了一天的opencv都快崩溃了。内存泄漏的让人无语,然后自适应阈值分析的时候,发现那个算法实在是慢到让人想把电脑狠狠地往地上砸,块匹配的时候也是问题多多。

先把MFC(vc6.0)与opencv结合的代码发上来以备用。

1. 建立基于对话框(dialog based)的MFC工程。(最好用静态的Using static……),设工程名为test。

2. 添加一个picture控件(ID假设为IDC_SHOWAVI),4个button控件(设ID分别为ID_BTNOPEN , ID_BTNPLAY , ID_BTNPAUSE, ID_BTNSTOP,分别对应4个响应函数OnBtnOpen, OnBtnPlay ,OnBtnPause, OnBtnStop)。

3. 工程->设置->link添加好需要的*.lib文件(cv.lib highgui.lib cxcore.lib等等)。

4. 在CtestDlg.h开头加上下面两行

// CtestDlgg.h : header file

//

#include "highgui.h"

#include "cv.h"

#if !defined(AFX_LENSDIVIDEDLG_H__180CC67F_3199_4F65_9CBC_4414B309D13B__INCLUDED_)

#define AFX_LENSDIVIDEDLG_H__180CC67F_3199_4F65_9CBC_4414B309D13B__INCLUDED_

5. 进入CtestDlg.cpp文件中定义以下全局变量

/  // CLensdivideDlg dialog  CvvImage m_CvvImage;  CWnd *pwnd;  CRect rect;  CDC *pDC;  HDC hDC;  BOOL isAviFile = FALSE, isPlaying = FALSE, paused = FALSE;  int totalFrameNumber = 0, currentFrameIndex = 0, speed = 20, fps = 0;  CString filePath = "";  CvCapture *capture = NULL;  IplImage *currentFrame = NULL;

6. open按钮写入下面代码

void CtestDlg::OnBtnOpen() {  // TODO: Add your control notification handler code here  filePath = "视频类型(*.avi) | *.avi |";  CFileDialog dlg(TRUE, NULL, "*.avi", OFN_FILEMUSTEXIST | OFN_HIDEREADONLY, filePath, this);  if (dlg.DoModal() == IDOK)  {   if(isPlaying)   {    OnBtnStop();   }   if(isAviFile)   {    closeAviFile();   }   KillTimer(1);    pwnd = GetDlgItem(IDC_SHOWAVI);   //获取显示视频的控件ID   pDC = pwnd->GetDC();   hDC = pDC->GetSafeHdc();          //句柄   GetDlgItem(IDC_SHOWAVI)->GetClientRect(rect);  //获取控件的RECT    capture = cvCreateFileCapture(dlg.GetPathName());      //捕获视频   if(!capture)   {    AfxMessageBox("打开文件失败!");    return;   }                  //帧总数:   totalFrameNumber = (int)cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_COUNT);   if(totalFrameNumber == 0)   {    AfxMessageBox("不能打开该格式文件!");    return;   }   fps = (int)cvGetCaptureProperty(capture, CV_CAP_PROP_FPS);   //帧率   isAviFile = TRUE;   currentFrameIndex = 0;                       //第一帧播放   OnBtnPlay();             //自动播放  } }

7. play按钮:

void CtestDlg::OnBtnPlay() {  // TODO: Add your control notification handler code here  isPlaying = TRUE;  if(fps > 0 && fps < 1000)        //获取视频本身的播放速度  {   speed = (int)(1000/fps);        //每一帧多少毫秒  }  else speed = 0;  SetTimer(1, speed, NULL);                //每隔一段时间读出一帧视频图像   if(currentFrameIndex > totalFrameNumber)   return;         //设置播放帧位置:  cvSetCaptureProperty(capture, CV_CAP_PROP_POS_FRAMES, (currentFrameIndex % totalFrameNumber));    currentFrame = cvQueryFrame(capture);         //获取一帧   if(currentFrame)  {   m_CvvImage.CopyOf(currentFrame,1);   m_CvvImage.DrawToHDC(hDC,&rect);   //视频显示到控件  } }

8. pause按钮

void CtestDlg::OnBtnPause() {  // TODO: Add your control notification handler code here  if(isPlaying)  {   KillTimer(1);   isPlaying = FALSE;   paused = TRUE;//暂停  } }

9. stop按钮

void CtestDlg::OnBtnStop() {  // TODO: Add your control notification handler code here  if(isPlaying||paused)  {   currentFrameIndex = 1;  //回到第一帧位置   OnBtnPlay();//预览第一帧图像   KillTimer(1);   isPlaying = FALSE;  } }

10. 涉及到的closeAviFile()

void CtesteDlg::closeAviFile() {  if(capture)  {   cvReleaseCapture(&capture);  } }

11. 最后要加上timer才行

void CtestDlg::OnTimer(UINT nIDEvent) {  // TODO: Add your message handler code here and/or call default  if(isAviFile)  {//选择播放视频   if(currentFrameIndex > totalFrameNumber)   {//判断视屏是否已经是最后一帧,即是否播完    currentFrameIndex = 0;                      //回到第一帧,继续播放    KillTimer(1);    OnBtnStop();   }   else   {    OnBtnPlay();     //播放第currentFrame帧    currentFrameIndex ++;                      //下一帧的位置   }  }  currentFrameIndex = (int)cvGetCaptureProperty(capture, CV_CAP_PROP_POS_FRAMES);   CDialog::OnTimer(nIDEvent); }

12. 双击取消(Cancel)按钮,响应函数:

void CtestDlg::OnCancel
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MFC(Microsoft Foundation Classes)是Microsoft公司开发的一个用于Windows应用程序开发的C++类库。它提供了一个图形用户界面(GUI)框架,使开发人员可以创建Windows应用程序。OpenCV(Open Source Computer Vision)是一个开源的计算机视觉库,它支持各种图像处理和计算机视觉算法,包括图像处理、高级计算机视觉、机器学习、目标检测和跟踪等。 MFCOpenCV可以一起使用来开发Windows图像处理应用程序。MFC提供了图形界面,可以让用户与程序进行交互;而OpenCV提供了强大的图像处理和计算机视觉功能,可以对图像进行分析和处理。使用MFCOpenCV结合起来可以让开发人员轻松地创建一个功能强大的图像处理程序。 在使用MFCOpenCV开发图像处理应用程序时,开发人员需要熟悉MFCOpenCV的相关知识,掌握MFC的Windows编程和OpenCV的图像处理能力。开发人员可以使用MFC的窗口、对话框和控件等创建图形界面,然后使用OpenCV来进行图像的读取、处理和输出等操作。开发人员需要在开发过程中注意MFCOpenCV的相互调用关系,使得程序可以正确运行。 总之,MFCOpenCV是两个强大的工具,它们可以一起使用来开发图像处理应用程序。在使用MFCOpenCV开发图像处理应用程序时,开发人员需要熟悉它们的相关知识并合理地运用它们的功能,才能开发出高效、易用、功能强大的应用程序。 ### 回答2: MFC是Microsoft Foundation Class的缩写,是Windows操作系统上的一个GUI应用程序框架,可以帮助开发者快速地创建窗口和用户界面。而OpenCV是一个流行的开源计算机视觉库,可以用于图像处理、模式识别、物体跟踪等方面。由于MFCOpenCV都是针对Windows系统的开发,因此结合使用这两个工具可以方便地实现图像处理和GUI设计的功能。 通过MFC,开发者可以创建一个具有图形界面的应用程序,然后与OpenCV结合可以实现图像处理的各种功能,例如图像滤波,图像分割,特征提取等。通过这种方法,开发者可以快速且方便地开发出图像处理软件,而且可以为MFC界面添加很多可以增强用户体验的控件。 举个例子,假设我们要设计一个用于人脸识别的软件,我们可以使用MFC创建一个简单的用户界面,然后通过OpenCV提供的人脸检测算法来实现人脸识别功能。在这个软件中,OpenCV将负责图像处理和人脸检测部分,而MFC将负责用户界面的设计和数据的输入输出。 总之,MFCOpenCV的结合可以为Windows下的图像处理软件开发提供很大的便利,可以满足很多应用程序的需求。 ### 回答3: MFC是Microsoft Foundation Class的缩写,是微软公司针对Windows操作系统开发的应用程序框架。它提供了许多可重用的类,用于简化Windows应用程序的开发过程。而OpenCV是一种开源计算机视觉库,提供了许多图像处理和计算机视觉算法及工具,可以用于实现包括人脸检测、图像识别等多种应用。它的优势在于它的代码简洁易懂,易于学习,同时也提供了Python、C++等多种编程语言的接口。 使用MFCOpenCV4相结合可以实现很多图像处理的应用,比如图像的读入、载入、预处理、显示等等,可以非常方便的实现对图像的各种操作。另外,MFC框架可以提供一些Windows操作系统的API,用于支持与系统交互的功能,比如打开选择文件框、保存文件框等等。结合OpenCVMFC的图像处理应用可以方便的实现这些操作和一些自定义的交互界面。 总之,MFCOpenCV4的结合可以方便、高效的实现计算机视觉领域的图像处理应用程序,为人工智能和机器视觉等领域提供了很好的支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值