VS2013 / MFC + OpenCV 2.4.9实现视频的播放暂停和结束

来源:互联网 发布:搜狗拼音输入法云计算 编辑:程序博客网 时间:2024/06/06 12:41

这次和大家分享一个简单的MFC+Opencv2.4.9实现的视频播放,暂停和结束的案例,在这个demo中会用到线程的一点知识,这里就不啰嗦了。由于刚接触MFC和OpenCV,所以还是讲解的详细一点,希望可以帮助更多编程的朋友吧!

1 新建项目

1.1 文件--》新建--》项目--》MFC应用程序,程序命名为VideoPlayer,点击确定

点击下一步

选择基于对话框,在静态库中使用mfc 完成

出现下图的界面:

接下来我们就拖几个控件,首先在工具箱中拖一个picture控件

拖上去以后调整大小,点击属性,将Type设置为Rectangle

再拖一个Button

添加button后

点击button1属性分别修改id为IDC_STARTVIDEO  caption为开始

双击进去便会生成一个OnBnClickedStartvideo()控件方法

同样的方法添加暂停和结束按钮,最后界面如图所示:

点击暂停按钮,添加一个变量,变量名为StopButton


2 配置opencv环境

关于opencv的环境配置这里不多说了,请参考【OpenCV学习笔记001】 VS2013+OpenCV2.4.9开发环境的搭建

3 编写代码

引入opencv头文件,定义两个全局变量,

声明并定义一个线程函数DWORD WINAPI PlayVideo(LPVOID lpParam);

[cpp] view plain copy
  1. DWORD WINAPI PlayVideo(LPVOID lpParam){  
  2.   
  3.     CVideoPlayerDlg* pThis = (CVideoPlayerDlg*)lpParam;  
  4.   
  5.     CvCapture* pCapture;  
  6.     IplImage* pFrame;  
  7.   
  8.     pCapture = cvCreateFileCapture("屌丝男士.mov");  
  9.   
  10.     if (pCapture == NULL)  
  11.     {  
  12.         return -1;  
  13.     }  
  14.   
  15.     pFrame = cvQueryFrame(pCapture);  
  16.     while (pFrame)  
  17.     {  
  18.         WaitForSingleObject(start_event, INFINITE);  
  19.         start_event.SetEvent();  
  20.         if (terminate_flag == -1)  
  21.         {  
  22.             terminate_flag = 0;  
  23.             _endthreadex(0);  
  24.         };  
  25.         pThis->Display(pFrame, IDC_STATIC);  
  26.         Sleep(33);  
  27.         pFrame = cvQueryFrame(pCapture);  
  28.     }  
  29.   
  30.     cvReleaseCapture(&pCapture);  
  31.   
  32. }  
声明并定义一个显示图片到MFC的picture控件的函数void Display(IplImage * img ,UINT ID);
[cpp] view plain copy
  1. void CVideoPlayerDlg::Display(IplImage * img,UINT ID){  
  2.   
  3.     CDC* pDC = GetDlgItem(ID)->GetDC();  //CDC是一个类  
  4.     //GetDlgItem(ID)获取控件窗口对象,GetDC()由窗口对象得到DC,然后可以用来在控件中画图  
  5.     //上一句等价于CWnd* pWin=GetDlgItem(ID);  CDC* pDC=pWin->GetDC();  
  6.   
  7.     HDC hDC = pDC->GetSafeHdc();//HDC是一个句柄     
  8.     CRect rect;  
  9.     CWnd  *pWnd;  
  10.   
  11.     int picWidth;  
  12.     int picHeight;  
  13.   
  14.     pWnd = GetDlgItem(ID);  
  15.     pWnd->GetClientRect(&rect);  
  16.   
  17.     //求图片控件的宽和高  
  18.     picWidth = rect.Width();  
  19.     picHeight = rect.Height();  
  20.   
  21.     IplImage*dst = cvCreateImage(cvSize(picWidth, picHeight), img->depth, img->nChannels);  
  22.     cvResize(img, dst, CV_INTER_LINEAR);  
  23.   
  24.     //  cvFlip(dst,NULL,0);       
  25.     //在控件里显示图片  
  26.     CvvImage cimg;  
  27.     cimg.CopyOf(dst);  
  28.     cimg.DrawToHDC(hDC, &rect);  
  29.     cvReleaseImage(&dst);  
  30.     ReleaseDC(pDC);  
  31. }  

点击开始按钮,添加代码

[cpp] view plain copy
  1. void CVideoPlayerDlg::OnBnClickedStartvideo()  
  2. {  
  3.     // TODO:  在此添加控件通知处理程序代码  
  4.   
  5.     HANDLE hThreadSend;         //创建独立线程发送数据  
  6.     DWORD ThreadSendID;  
  7.   
  8.     start_event.SetEvent();  
  9.   
  10.     hThreadSend = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)PlayVideo, (LPVOID)this, 0, &ThreadSendID);  
  11.     CloseHandle(hThreadSend);  
  12. }  

点击暂停按钮,添加代码

[cpp] view plain copy
  1. void CVideoPlayerDlg::OnBnClickedSuspendvideo()  
  2. {  
  3.     // TODO:  在此添加控件通知处理程序代码  
  4.     CString buttonText;  
  5.     StopButton.GetWindowText(buttonText);  
  6.   
  7.     if (buttonText.Compare(_T("暂停"))==0)  
  8.     {  
  9.         start_event.ResetEvent();  
  10.         StopButton.SetWindowTextW(_T("继续"));  
  11.   
  12.     }  
  13.     else  
  14.     {  
  15.         start_event.SetEvent();  
  16.         StopButton.SetWindowText(_T("暂停"));  
  17.     }  
  18. }  

点击结束按钮,添加代码

[cpp] view plain copy
  1. void CVideoPlayerDlg::OnBnClickedStopvideo()  
  2. {  
  3.     // TODO:  在此添加控件通知处理程序代码  
  4.     terminate_flag = -1;  
  5. }  
最后我们将Opencv2.2以后的版本就取消了CvvImage这个类,而显示图片到MFC的Picture控件需要用到这个类,所以需要准备CvvImage.h和CvvImage.cpp文件(从以前版本的源码中获得),下载地址:http://download.csdn.net/detail/davebobo/9488047

将下载到的头文件和源文件添加到工程中即可,最后看一下我们的成果

源码CSDN下载地址:http://download.csdn.net/detail/davebobo/9489090

运行工程需要自己配置opencv环境。

2
 
0