您的位置:首页 > 运维架构

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

2017-06-12 16:03 597 查看
这次和大家分享一个简单的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

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);

[cpp] view
plain copy

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);  

}  

点击开始按钮,添加代码

[cpp] view
plain copy

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);  

}  

点击暂停按钮,添加代码

[cpp] view
plain copy

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("暂停"));  

    }  

}  

点击结束按钮,添加代码

[cpp] view
plain copy

void CVideoPlayerDlg::OnBnClickedStopvideo()  

{  

    // TODO:  在此添加控件通知处理程序代码  

    terminate_flag = -1;  

}  

最后我们将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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: