OpenCV中文網站上有講怎么使用OpenCV讀入和顯示圖像和視頻 但它的顯示是使用的OpenCV庫里面的簡單的GUI,用來測試驗證可以,如果要做成可視化工程,還是得借助專門的GUI開發(fā)工具了。本文簡述使用MFC顯示圖像和視頻。 1.讀取并顯示圖像 顯示圖像或視頻使用VC中的Picture控件,用到VC圖形設備接口的設備上下文(CDC類)。比如打開顯示這樣一個圖片lean.jpg 先進行一些初始化工作,代碼如下: 1 // DemoDlg.h 2 #include <highgui.h> 3 4 //在CDemoDlg類定義中加入如下幾行 5 private: 6 CRect rect; 7 CStatic* pStc; //標識圖像顯示的Picture控件 8 CDC* pDC; //視頻顯示控件設備上下文 9 HDC hDC; //視頻顯示控件設備句柄 10 CvCapture* capture; //視頻獲取結構 11 12 //DemoDlg.cpp 13 #include <cv.h> 14 #include <highgui.h> 15 #include <cvaux.h> 16 #include <ml.h> 17 18 //在CDemoDlg構造函數(shù)內添加以下幾行,指針初始化 19 pStc=NULL; 20 pDC=NULL; 21 capture=NULL; 22 23 //在CDemoDlg類的OnInitDialog()中添加如下幾行,進行初始化 24 BOOL CFaceDlg::OnInitDialog() 25 { 26 //框架生成代碼....... 27 28 pStc=(CStatic *)GetDlgItem(IDC_VIEW);//IDC_VIEW為Picture控件ID 29 pStc->GetClientRect(&rect);//將CWind類客戶區(qū)的坐標點傳給矩形 30 pDC=pStc->GetDC(); //得到Picture控件設備上下文 31 hDC=pDC->GetSafeHdc(); //得到控件設備上下文的句柄 32 33 return TRUE; 34 } 如上就將Picture控件的設備上下文句柄與圖片/視頻顯示的矩形區(qū)域聯(lián)系起來。 下面顯示圖片,在對話框上添加一個打開按鈕,點擊該按鈕觸發(fā)讀取顯示圖像的事件,事件響應如下: 1 void CDemoDlg::OnOpen() 2 { 3 IplImage * img=cvLoadImage("lena.jpg");//load image from file 4 CvvImage cvvImg; //CvvImage類 2.讀取并顯示視頻 因為視頻時一幀一幀的圖像,因此顯示視頻可以理解為間斷地讀取并顯示不同幀的圖像。這里有一個要點,為了合理利用資源,盡量不要使用一個死循環(huán)一直讀取視頻中的幀數(shù)據(jù),應該根據(jù)視頻的幀率設置合適的時鐘,定時地對視頻中的幀圖像進行讀取顯示。因為幀率通常很低,所以顯示的每一幀圖像看起來就會使連續(xù)的。 對于視頻(視頻文件/攝像頭)的操作,OpenCV中文網站的參考手冊上給你詳細的用法,詳見http://www./index.php/HighGUI%E8%A7%86%E9%A2%91%E8%AF%BB%E5%86%99%E5%87%BD%E6%95%B0 這里給出視頻文件的讀取與現(xiàn)實(因為沒攝像頭,攝像頭的還沒有測試)。 初始化工作同上面的圖像讀取顯示一樣,所不同的是CDemoDlg::OnOpen()事件響應函數(shù)中的代碼有區(qū)別,如下 1 void CDemoDlg::OnOpen() 2 { 3 if (!capture) 4 { 5 capture=cvCaptureFromAVI("D://OtherUse//11.avi"); //初始化一個視頻文件捕捉器 6 } 7 if(!capture) 8 { 9 AfxMessageBox("無法獲得攝像頭"); 然后設置時間響應,定時到達后,處理OnTimer(UINT nIDEvent)事件,視頻顯示在這里面完成。 1 void CDemoDlg::OnTimer(UINT nIDEvent) 2 { 3 // TODO: Add your message handler code here and/or call default 4 if(1==nIDEvent) 5 { 6 IplImage* img=0; 7 img=cvQueryFrame(capture); //從攝像頭或者文件中抓取并返回一幀 8 //cvGrabFrame( capture ); //從攝像頭或者視頻文件中抓取幀 9 //img=cvRetrieveFrame(capture); //取回由函數(shù)cvGrabFrame抓取的圖像 10 CvvImage m_CvvImage; 11 m_CvvImage.CopyOf(img,1); //復制該幀圖像 12 m_CvvImage.DrawToHDC(hDC, &rect); //顯示到設備的矩形框內 13 } 14 CDialog::OnTimer(nIDEvent); |
|