VS2010在MFC中用opencv實(shí)現(xiàn)對視頻中動(dòng)態(tài)目標(biāo)的追蹤_第1頁
VS2010在MFC中用opencv實(shí)現(xiàn)對視頻中動(dòng)態(tài)目標(biāo)的追蹤_第2頁
VS2010在MFC中用opencv實(shí)現(xiàn)對視頻中動(dòng)態(tài)目標(biāo)的追蹤_第3頁
VS2010在MFC中用opencv實(shí)現(xiàn)對視頻中動(dòng)態(tài)目標(biāo)的追蹤_第4頁
VS2010在MFC中用opencv實(shí)現(xiàn)對視頻中動(dòng)態(tài)目標(biāo)的追蹤_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、Visual Studio2010在MFC中用opencv實(shí)現(xiàn)對視頻中動(dòng)態(tài)目標(biāo)的追蹤第二步,建立一個(gè)MFC的對話框程序,做兩個(gè)按鈕,一個(gè)“打開視頻文件”,一個(gè)“運(yùn)動(dòng)跟蹤處理”。具體操作:1 建立MFC對話框程序的框架:File -New - MFC AppWizard(exe),選取工程路徑,并取工程名“VideoProcesssing”- Next - 選擇Dialog based后,去掉使用Unicode庫的勾,選擇在靜態(tài)庫中使用 MFC,點(diǎn)Finish,點(diǎn)OK.2 添加按鈕:直接Delete掉界面默認(rèn)的兩個(gè)“確定”“取消”按鈕。然后添加兩個(gè)button,分別名為“打開視頻”,“運(yùn)動(dòng)跟蹤處

2、理”,其ID分別設(shè)為IDC_OPEN_VIDEO,IDC_TRACKING.3 添加消息響應(yīng)函數(shù):雙擊按鈕“打開視頻文件”,自動(dòng)生成響應(yīng)函數(shù)名OnOpenVideo,點(diǎn)Ok。然后添加如下代碼:CFileDialog dlg(true,*.avi,NULL,NULL,*.avi|*.avi|);if (dlg.DoModal()=IDOK)strAviFilePath = dlg.GetPathName();elsereturn;同樣,雙擊“運(yùn)動(dòng)跟蹤處理”按鈕,選擇默認(rèn)的響應(yīng)函數(shù)名,然后添加代碼:/聲明IplImage指針I(yè)plImage* pFrame = NULL;IplImage* pFr

3、Img = NULL;IplImage* pBkImg = NULL;CvMat* pFrameMat = NULL;CvMat* pFrMat = NULL;CvMat* pBkMat = NULL;CvCapture* pCapture = NULL;int nFrmNum = 0;/打開AVI視頻文件if(strAviFilePath=) /判斷文件路徑是否為空MessageBox(請先選擇AVI視頻文件!);return;elseif(!(pCapture = cvCaptureFromFile(strAviFilePath)MessageBox(打開AVI視頻文件失敗!);retur

4、n;/創(chuàng)建窗口cvNamedWindow(Video, 1);cvNamedWindow(Background,1);cvNamedWindow(Foreground,1);/使窗口有序排列,窗口寬330cvMoveWindow(Video, 30, 0);cvMoveWindow(Background, 360, 0);cvMoveWindow(Foreground, 690, 0);/逐幀讀取視頻while(pFrame = cvQueryFrame( pCapture )nFrmNum+;/如果是第一幀,需要申請內(nèi)存,并初始化if(nFrmNum = 1)pBkImg = cvCreat

5、eImage(cvSize(pFrame-width, pFrame-height), IPL_DEPTH_8U,1); / 存放背景圖像(灰度)pFrImg = cvCreateImage(cvSize(pFrame-width, pFrame-height), IPL_DEPTH_8U,1); / 存放中間圖像(灰度)pBkMat = cvCreateMat(pFrame-height, pFrame-width, CV_32FC1);pFrMat = cvCreateMat(pFrame-height, pFrame-width, CV_32FC1);pFrameMat = cvCrea

6、teMat(pFrame-height, pFrame-width, CV_32FC1);/轉(zhuǎn)化成單通道圖像再處理(灰度)cvCvtColor(pFrame, pBkImg, CV_BGR2GRAY);cvCvtColor(pFrame, pFrImg, CV_BGR2GRAY);cvConvert(pFrImg, pFrameMat);cvConvert(pFrImg, pFrMat);cvConvert(pFrImg, pBkMat);elsecvCvtColor(pFrame, pFrImg, CV_BGR2GRAY); /轉(zhuǎn)化成單通道圖像再處理(灰度)cvConvert(pFrImg,

7、 pFrameMat);/高斯濾波先,以平滑圖像/cvSmooth(pFrameMat, pFrameMat, CV_GAUSSIAN, 3, 0, 0);/當(dāng)前幀跟背景圖相減(求背景差并取絕對值)cvAbsDiff(pFrameMat, pBkMat, pFrMat);/二值化前景圖(這里采用特定閾值進(jìn)行二值化)cvThreshold(pFrMat, pFrImg, 60, 255.0, CV_THRESH_BINARY);/進(jìn)行形態(tài)學(xué)濾波,去掉噪音cvErode(pFrImg, pFrImg, 0, 1);cvDilate(pFrImg, pFrImg, 0, 1);/滑動(dòng)平均更新背景(求

8、平均)cvRunningAvg(pFrameMat, pBkMat, 0.003, 0);/將背景轉(zhuǎn)化為圖像格式,用以顯示cvConvert(pBkMat, pBkImg);/ 保持原圖像的旋轉(zhuǎn)方向pBkImg-origin = pFrImg-origin = pFrame-origin;/顯示圖像cvShowImage(Video, pFrame);cvShowImage(Background, pBkImg);cvShowImage(Foreground, pFrImg);/如果有按鍵事件,則跳出循環(huán)/此等待也為cvShowImage函數(shù)提供時(shí)間完成顯示/等待時(shí)間可以根據(jù)CPU速度調(diào)整if

9、( cvWaitKey(200) = 0 )break;/銷毀窗口cvDestroyWindow(Video);cvDestroyWindow(Background);cvDestroyWindow(Foreground);/釋放圖像和矩陣cvReleaseImage(&pFrImg);cvReleaseImage(&pBkImg);cvReleaseMat(&pFrameMat);cvReleaseMat(&pFrMat);cvReleaseMat(&pBkMat);cvReleaseCapture(&pCapture);4 選fileview選項(xiàng)卡中VideoProcessingDlg.h

10、,在CVideoProcessingDlg類中添加公有類成員:CString strAviFilePath;5 選fileview選項(xiàng)卡中VideoProcessingDlg.cpp,添加opencv頭文件#include cv.h#include highgui.h#include cxcore.h6 編譯執(zhí)行,成功!還可以添加一個(gè)”錄制視頻”的按鈕,修改ID號為IDC_RECORD, 雙擊“錄制視頻”按鈕,選擇默認(rèn)的響應(yīng)函數(shù)名,然后添加代碼:CvCapture* capture=cvCaptureFromCAM(-1); /打開攝像頭 CvVideoWriter* video=NULL;

11、IplImage* frame=NULL; int n; if(!capture) /如果不能打開攝像頭給出警告 coutCan not open the camera.width,frame-height); /創(chuàng)建CvVideoWriter對象并分配空間 /保存的文件名為camera.avi,編碼要在運(yùn)行程序時(shí)選擇,大小就是攝像頭視頻的大小,幀頻率是32 if(video) /如果能創(chuàng)建CvVideoWriter對象則表明成功 coutVideoWriter has created.endl; cvNamedWindow(Camera Video,1); /新建一個(gè)窗口 int i = 0

12、; while(i = 200) / 讓它循環(huán)200次自動(dòng)停止錄取 frame=cvQueryFrame(capture); /從CvCapture中獲得一幀 if(!frame) coutCan not get frame from the capture.endl; break; n=cvWriteFrame(video,frame); /判斷是否寫入成功,如果返回的是1,表示寫入成功 coutn0) break; /有其他鍵盤響應(yīng),則退出 cvReleaseVideoWriter(&video); cvReleaseCapture(&capture); cvDestroyWindow(C

13、amera Video); return ; 第二步,建立一個(gè)編程環(huán)境,然后加載opencv的庫路徑等等。具體步驟如下。PATH D:OpenCV2.3.1buildOPENCV D:OpenCV2.3.1buildx86vc10bin如下圖所示。 配置VS2010,選擇“視圖”“其他窗口”“屬性管理器”,如下圖所示。 雙擊Debug | Win32下的“Microsoft.Cpp.Win32.user”,如下圖所示。 在彈出的配置框中配置,選擇“VC+目錄”。1、在“包含目錄”中的結(jié)尾處(若結(jié)尾處無英文狀態(tài)下的“;”則需自行添加“;”,下同)加入以下內(nèi)容添加以下內(nèi)容:$(opencv)includeopencv;$(opencv)includeopencv2;$(opencv)include;2、在庫目錄中的結(jié)尾處加入以下內(nèi)容添加:$(opencv)x86vc10lib;注:$(opencv)includeopencv是告訴VC去“opencv”這個(gè)變量中的文件夾下的includeopencv路徑中找OpenCV的庫文件目錄。如下圖所示。 在“鏈接器”-“輸入”-“附加依賴選項(xiàng)”中的結(jié)尾處加入以下內(nèi)容:$(opencv)x86vc10libopencv_core231d.lib;$(opencv)x86vc10libopencv_highgui231d.lib;$(op

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論