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


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

1 新建项目

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

VS2013 / MFC + OpenCV 2.4.9实现视频的播放暂停和结束_第1张图片

点击下一步

VS2013 / MFC + OpenCV 2.4.9实现视频的播放暂停和结束_第2张图片

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

VS2013 / MFC + OpenCV 2.4.9实现视频的播放暂停和结束_第3张图片

出现下图的界面:

VS2013 / MFC + OpenCV 2.4.9实现视频的播放暂停和结束_第4张图片

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

VS2013 / MFC + OpenCV 2.4.9实现视频的播放暂停和结束_第5张图片

拖上去以后调整大小,点击属性,将Type设置为RectangleVS2013 / MFC + OpenCV 2.4.9实现视频的播放暂停和结束_第6张图片

再拖一个Button

VS2013 / MFC + OpenCV 2.4.9实现视频的播放暂停和结束_第7张图片

添加button后

VS2013 / MFC + OpenCV 2.4.9实现视频的播放暂停和结束_第8张图片

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

VS2013 / MFC + OpenCV 2.4.9实现视频的播放暂停和结束_第9张图片

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

VS2013 / MFC + OpenCV 2.4.9实现视频的播放暂停和结束_第10张图片

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

VS2013 / MFC + OpenCV 2.4.9实现视频的播放暂停和结束_第11张图片

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

VS2013 / MFC + OpenCV 2.4.9实现视频的播放暂停和结束_第12张图片VS2013 / MFC + OpenCV 2.4.9实现视频的播放暂停和结束_第13张图片

2 配置opencv环境

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

3 编写代码

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

VS2013 / MFC + OpenCV 2.4.9实现视频的播放暂停和结束_第14张图片

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

DWORD WINAPI PlayVideo(LPVOID lpParam){

	CVideoPlayerDlg* pThis = (CVideoPlayerDlg*)lpParam;

	CvCapture* pCapture;
	IplImage* pFrame;

	pCapture = cvCreateFileCapture("屌丝男士.mov");

	if (pCapture == NULL)
	{
		return -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_STATIC);
		Sleep(33);
		pFrame = cvQueryFrame(pCapture);
	}

	cvReleaseCapture(&pCapture);

}
声明并定义一个显示图片到MFC的picture控件的函数void Display(IplImage * img ,UINT ID);
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);
}

点击开始按钮,添加代码

void CVideoPlayerDlg::OnBnClickedStartvideo()
{
	// TODO:  在此添加控件通知处理程序代码

	HANDLE hThreadSend;			//创建独立线程发送数据
	DWORD ThreadSendID;

	start_event.SetEvent();

	hThreadSend = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)PlayVideo, (LPVOID)this, 0, &ThreadSendID);
	CloseHandle(hThreadSend);
}

点击暂停按钮,添加代码

void CVideoPlayerDlg::OnBnClickedSuspendvideo()
{
	// TODO:  在此添加控件通知处理程序代码
	CString buttonText;
	StopButton.GetWindowText(buttonText);

	if (buttonText.Compare(_T("暂停"))==0)
	{
		start_event.ResetEvent();
		StopButton.SetWindowTextW(_T("继续"));

	}
	else
	{
		start_event.SetEvent();
		StopButton.SetWindowText(_T("暂停"));
	}
}

点击结束按钮,添加代码

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

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

VS2013 / MFC + OpenCV 2.4.9实现视频的播放暂停和结束_第15张图片

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

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

你可能感兴趣的:(我的开源项目,OpenCV)