MFC中使用OpenCV捕捉攝像頭視頻并在Image控件中播放_第1頁
MFC中使用OpenCV捕捉攝像頭視頻并在Image控件中播放_第2頁
MFC中使用OpenCV捕捉攝像頭視頻并在Image控件中播放_第3頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、在參加騰訊校園之星大賽中做了一些手勢識別的插件,其中需要使用Ope nC相關(guān)的東西,今天將它整理一下,希望對其他人能有所幫助。首先, OpenCV 2.1似乎不能獲取設(shè)想設(shè)備的數(shù)目,名稱以及其它相關(guān)屬性,在 實(shí)際應(yīng)用中很不方便,為了解決這個問題,OpenC論壇上YuShiQi老師給出了一個風(fēng)轉(zhuǎn)好的CameraDS類,通過Directshow來調(diào)用攝像頭(詳情請見 使用 DirectShow 采集圖像 ),不過,這 個類只在VC+6.0編譯下通過,對于VS2005 2008和2010,需要做相應(yīng)的設(shè)置, 如下:1、在CameraDS.h包含頭文件之上預(yù)先定義加入如下代碼 #define POIN

2、TER_64 _ptr642、將 project ->Property-> c+ ->general->Additional Include Directories的 DirectShow/IncludeDirectories->include挪到 tools->options->project and solutions->vc+files 的文件末尾就可以了,當(dāng)然也可以換成絕對目錄。問題解決后,就可以在vs2005,vs2008 上編譯該工程了其次,捕捉到了視頻,還需要將它顯示在Image控件上,這里就沒有OpenCVl身所使用的 UI 控件

3、那么方便了,需要自己定義 Timer 函數(shù)來重復(fù)調(diào)用,過程如 下:/ 打開該攝像頭之前, 因先檢查之前是否在進(jìn)行圖像捕捉, 若有, 關(guān)閉 ReleaseCapture();/ 打開攝像頭if(!camera.OpenCamera(sgCurSelCameraIndex,false,FRAME_WIDTH,FRAME_HEI GHT)/這里使用CameraDS的方法打開攝像頭MessageBox(_T("打開視頻設(shè)備"+sgCameraName+失敗,請檢查 設(shè)備狀態(tài) "),_T("SmartGesture 插件信息 "), MB_OK | MB

4、_ICONEXCLAMATION);SetTimer(status,30,NULL);/ 關(guān)鍵是這里,需要自己定義 Timer 函數(shù)去 反復(fù)讀取圖像并將它顯示出來,處理的代碼會在On Timer函數(shù)中出現(xiàn)SetTimer函數(shù)第一個參數(shù)是Timer的標(biāo)識ID,也就是下面出現(xiàn)的nIDEvent。可 以根據(jù)不同的ID調(diào)用不同的On Timer函數(shù),第二個參數(shù)是調(diào)用的時間間隔,單 位是ms,第三個回調(diào)函數(shù),這里在下面的 On Timer函數(shù)中定義。接下來再來看 On Timer 函數(shù):/ 定時器,用于定期查詢攝像頭并獲得相應(yīng)的幀并進(jìn)行處理void SmartGestureDlg:OnTimer(UIN

5、T_PTR nIDEvent)/ TODO: 在此添加消息處理程序代碼和 / 或調(diào)用默認(rèn)值sgFrame = camera.QueryFrame();/ 從攝像頭獲得 IplImage 類型的圖片/ 依據(jù)事件類型對捕捉的圖像進(jìn)行不同的處理switch (nIDEvent)case SG_NORMAL: / 正常捕捉狀態(tài)下對幀不做處理 cvFlip(sgFrame,sgFrame,1);break;case SG_TRACING: / 跟蹤狀態(tài)SGTrace(sgFrame); / 跟蹤狀態(tài)下對幀進(jìn)行追蹤處理 break;case SG_SETTING: / 設(shè)置狀態(tài)SGSet(sgFrame)

6、; / 設(shè)置狀態(tài)下對圖像進(jìn)行設(shè)置處理 break;/將Ipllmage類型的圖片轉(zhuǎn)換成MFC能顯示的圖片格式,其中sgImage 的聲明為: CvvImage sgImage,sgFrame 的聲明為 IplImage*sgImage.CopyOf(sgFrame,3);/ 指定繪圖所需的 Picture 控件HDC sgIDCPicture =(GetDlgltem(IDC_FRAME)->GetDC()->GetSafeHdc();/ 從 MFC的界面上獲取 Image 控件,控件 ID 為 IDC_FRAMECRect rect; GetDlgItem(IDC_FRAME)-

7、>GetClientRect(&rect);/將圖片顯示到MFC的Picture 控件上 sgImage.DrawToHDC(sgIDCPicture,&rect);:ReleaseDC(this->m_hWnd,sgIDCPicture);/ 一定要記住釋放 DC,_super:OnTimer(nIDEvent);/ 重新調(diào)用 OnTimer 函數(shù)否則會造成內(nèi)存泄露另外需要注意,如果有多個狀態(tài)并調(diào)用了多個 OnTimer 函數(shù),在狀態(tài)轉(zhuǎn)變的時候, 或者是重新打開攝像頭的時候,一定記住要 Kill 掉之前的 Timer ,否則會造成 畫面的閃爍,之后導(dǎo)致應(yīng)用假死。如果不能有效的記錄 Timer 的 ID ,那就一次 將所有的 Timer 全部 Kill ,然后重新調(diào)用,如下:/ 退出插件之前需要釋放相應(yīng)的資源void SmartGestureDlg:ReleaseCapture()for (int i = 0; i < TEMPLATE_COUNT; i+)KillTimer(i);camera.CloseCamera();最后稍微提一下,使用CameraDSS取到的視頻圖像時Imllmage類型的,這個可 以使用OpenCV的函數(shù)處理,在顯示的時候,使用的是Cvvlmage類型的,需要注 意,可以在類中定義一個

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論