1. 程式人生 > >基於MFC的OpenCV簡單視訊播放器

基於MFC的OpenCV簡單視訊播放器


1.程式功能簡介

我們點選OpenFile按鈕,選取路徑,然後點選Ok,顯示或播放所選的圖片或視訊。

2.功能實現

2.1 Dlg類標頭檔案中新增以下項:

public:

CString FileName;//記錄所選檔案路徑
CRect rect;//關聯影象控制元件矩形
    CStatic* pStc; //標識影象顯示的Picture控制元件
    CDC* pDC; //視訊顯示控制元件裝置上下文
HDC hDC; //視訊顯示控制元件裝置控制代碼
CvCapture* capture; //視訊獲取結構

2.2 Dlg建構函式中初始化:

 pStc=NULL;
        pDC=NULL;
        capture=NULL;

2.3 Dlg::OnInitDialog()中新增如下程式碼:

        pStc=(CStatic *)GetDlgItem(IDC_VIEW);//IDC_VIEW為Picture控制元件ID
pStc->GetClientRect(&rect);//將CWind類客戶區的座標點傳給矩形
        pDC=pStc->GetDC(); //得到Picture控制元件裝置上下文
        hDC=pDC->GetSafeHdc(); //得到控制元件裝置上下文的控制代碼 

2.4 OpenFile按鈕訊息響應函式新增如下程式碼:

CFileDialog dlg(TRUE);//TRUE為OPEN對話方塊,FALSE為SAVE AS對話方塊
if(dlg.DoModal()==IDOK) //建立模態對話方塊
FileName=dlg.GetPathName();
SetDlgItemText(IDC_EDIT1,(LPCTSTR)FileName);//將檔案路徑顯示在文字控制元件中

2.5 OK按鈕詳細相應函式

if(!capture)
{
capture=cvCreateFileCapture((LPCTSTR)FileName);
}
if(!capture)
{
AfxMessageBox("Error!");
return;
}
SetTimer(1,25,NULL);

2.6 Dlg新增WM_TIMER事件響應

我們設定了定時器自動讀取視訊中的一幀,這裡對Dlg新增WM_TIMER事件響應函式

if(1==nIDEvent)

{

IplImage* frame;
frame=cvQueryFrame(capture);
//cvGrabFrame( capture ); //從攝像頭或者視訊檔案中抓取幀
        //frame=cvRetrieveFrame(capture); //取回由函式cvGrabFrame抓取的影象
CvvImage m_CvvImage;  
       m_CvvImage.CopyOf(frame,1); //複製該幀影象    
        m_CvvImage.DrawToHDC(hDC, &rect); //顯示到裝置的矩形框內
}

3.總結

注意CvvImage.h和CvvImage.cpp檔案的新增,之前在網上找到了一個檔案,新增後卻一直編譯不過,以為是自己程式有問題,後來發現是新增檔案的問題,希望大家使用的時候也要注意此類問題。下面資源裡的CvvImage.h和CvvImage.cpp檔案親測有效。

原始碼資源: