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

转载 2018年04月16日 17:29:33

本文介绍如何利用MFC创建视频的播放、暂停和结束。

转载博客地址:https://blog.csdn.net/davebobo/article/details/51123853

一、 新建项目

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

点击下一步

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

出现下图的界面:

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

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

再拖一个Button

添加button后

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

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

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

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

二、 配置opencv环境

如果是初次配置OpenCV环境,需要在环境变量中增加以下路径(右击计算机,属性,打开控制面板,点击左侧高级系统设置,环境变量),在系统变量的PATH中添加;D:\Program Files\opencv\build\x86\vc10\bin,具体配置方法看:【OpenCV学习笔记001】 VS2013+OpenCV2.4.9开发环境的搭建,这里不再啰嗦了。

三、 编写代码

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

声明并定义一个线程函数DWORD WINAPI PlayVideo(LPVOID lpParam);(将函数声明写在VideoPlayerDlg.cpp 文件下)

//读取视频帧线程
DWORD WINAPI PlayVideo(LPVOID lpParam){

	CVideoPlayerDlg* pThis = (CVideoPlayerDlg*)lpParam;//指针指向对话框

	CvCapture* pCapture;//录制、拍摄
	IplImage* pFrame;//画面

	pCapture = cvCreateFileCapture("屌丝男士.mov");//读取视频数据,cvCreateFileCapture()通过参数设置确定要读入的avi文件,返回一个指向CvCapture结构的指针。这个结构包括了所有关于要读入avi文件的信息,其中包含状态信息。

	if(pCapture==NULL)
	{
		return -1;//没有内容返回-1
	}

	pFrame = cvQueryFrame(pCapture);//从摄像头或者文件中抓取并返回一帧
	while (pFrame)
	{
		WaitForSingleObject(start_event, INFINITE);
		start_event.SetEvent();
		if (terminate_flag == -1)
		{
			terminate_flag = 0;
			_endthreadex(0);//关闭创建的线程
		};
		pThis->Display(pFrame, IDC_VIDEO);//输出模板
		Sleep(33);//间隔33毫秒
		pFrame = cvQueryFrame(pCapture);//间隔33毫秒,读取下一帧
	}
	cvReleaseCapture(&pCapture);//释放CvCapture结构
}

声明并定义一个显示图片到MFC的picture控件的函数void Display(IplImage * img ,UINT ID);(添加在VideoPlayerDlg.h中)


void CVideoPlayerDlg::Display(IplImage * img, UINT ID)
{
	CDC* pDC = GetDlgItem(ID)->GetDC();	//CDC是一个类
	//GetDlgItem(ID)获取控件窗口对象,GetDC()由窗口对象得到DC,然后可以用来在控件中画图
	//上一句等价于CWnd* pWin=GetDlgItem(ID);  CDC* pDC=pWin->GetDC();

	HDC hDC = pDC->GetSafeHdc();//HDC是一个句柄	
	CRect rect;
	CWnd  *pWnd;

	int picWidth;
	int picHeight;

	pWnd = GetDlgItem(ID);
	pWnd->GetClientRect(&rect);

	//求图片控件的宽和高
	picWidth = rect.Width();
	picHeight = rect.Height();

	IplImage*dst = cvCreateImage(cvSize(picWidth, picHeight), img->depth, img->nChannels);
	cvResize(img, dst, CV_INTER_LINEAR);

	//	cvFlip(dst,NULL,0);		
	//在控件里显示图片
	CvvImage cimg;
	cimg.CopyOf(dst);
	cimg.DrawToHDC(hDC, &rect);
	cvReleaseImage(&dst);
	ReleaseDC(pDC);
}

点击开始按钮,添加代码

  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. }  

点击暂停按钮,添加代码

  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. }  

点击结束按钮,添加代码

  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环境。

OpenCV视频进度播放控制

本来打算把进度条嵌入MFC的PIC空间里面,结果显示进度条消失,看来还是不要这个样子了。 全局变量区域: //2.初始化进度条的位置 int G_slider_position = ...
  • wishchin
  • wishchin
  • 2015-09-09 08:32:02
  • 1078

VS2013 MFC opencv 播放视频

看网上有很多人用的还是CvvImage类,但是Opencv3.0已经没有CvvImage这个类了。百度得之可以使用以前的类,稍作修改就可以了。 头文件: #pragma once #ifndef CV...
  • sz76211822
  • sz76211822
  • 2015-08-02 10:40:24
  • 1793

MFC下用OpenCV写的播放AVI程序,有暂停功能

  • 2012年09月03日 20:58
  • 5.19MB
  • 下载

VS2013 / MFC + OpenCV 2.4.9打开图片

因Opencv2.2以后的版本就取消了CvvImage这个类,而显示图片到MFC的Picture控件需要用到这个类,所以需要准备CvvImage.h和CvvImage.cpp文件(从以前版本的源码中获...
  • DaveBobo
  • DaveBobo
  • 2016-04-11 17:58:59
  • 4768

opencv 利用trackbar滚动条实现视频的播放和暂停控制

opencv 计算机视觉
  • yuanlunxi
  • yuanlunxi
  • 2015-03-28 20:49:53
  • 551

学习OpenCV2——控制视频暂停与播放

在opencv中让程序暂停有三种方法         waitKey( int delay)            如果delay≤0,则程序暂停,直到键盘按键才继续运行,返回按键的ASCII值;如果...
  • GDFSG
  • GDFSG
  • 2016-03-10 20:01:06
  • 5823

MFC中利用OpenCV实现视频播放

近期项目中在学习全景相机相关知识 当然首先要开始将基本的MFC学会才能封装SDK 首先建立MFC对话框工程                  具体的详细知识就不说了,网上有很多的教程。 添加如下控件 ...
  • xiabodan
  • xiabodan
  • 2014-11-21 19:09:03
  • 4226

MFC控件实现视频“暂停” “播放”循环

MFC“按钮”控件实现开始显示“播放”,按一下之后就开始播放相关视频,并且按钮显示为“暂停”,再按一下,视频暂停播放。 其中用到了static关键字,static a = 0;第一次调用函数时创建一...
  • qq_41068347
  • qq_41068347
  • 2018-01-23 14:16:17
  • 76

[7]ffmpeg+SDL2实现的视频播放器「退出、暂停、播放」

问题: 如何处理退出?如何判断一个流结束?如果有两个流,如何只结束其中一个? 想到的方法: 判断packet队列是否为空,空的话延时一段时间再判断一次,如果再为空就退出。 但是...
  • i_scream_
  • i_scream_
  • 2016-10-10 11:04:51
  • 2630

OpenCV系列1-简单高效:MFC显示图片、播放视频

先看图: 拉伸显示 居中显示 原始大小显示 显示视频: 实现图片显示,只需要两句话: 只需要包含一个h文件: 调整显示方式: 下面是CvImgCtrl.h的源代码,复制保存下来...
  • hope_v
  • hope_v
  • 2016-04-06 16:47:05
  • 4026
收藏助手
不良信息举报
您举报文章:VS2013 / MFC + OpenCV 2.4.9实现视频的播放暂停和结束
举报原因:
原因补充:

(最多只允许输入30个字)