VS2013 / MFC + OpenCV 2.4.9实现视频的播放暂停和结束
本文介绍如何利用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); }
点击开始按钮,添加代码
- 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;
- }
将下载到的头文件和源文件添加到工程中即可。
最后看一下我们的成果
源码CSDN下载地址:http://download.csdn.net/detail/davebobo/9489090
运行工程需要自己配置opencv环境。