C++如何調(diào)用opencv完成運(yùn)動(dòng)目標(biāo)捕捉詳解_第1頁
C++如何調(diào)用opencv完成運(yùn)動(dòng)目標(biāo)捕捉詳解_第2頁
C++如何調(diào)用opencv完成運(yùn)動(dòng)目標(biāo)捕捉詳解_第3頁
C++如何調(diào)用opencv完成運(yùn)動(dòng)目標(biāo)捕捉詳解_第4頁
C++如何調(diào)用opencv完成運(yùn)動(dòng)目標(biāo)捕捉詳解_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第C++如何調(diào)用opencv完成運(yùn)動(dòng)目標(biāo)捕捉詳解目錄一、原理說明:二、過程詳解:總結(jié)使用編譯器:QtCreator4.2.1

一、原理說明:

差幀識別原理:將這一幀的圖像和上一幀的圖像進(jìn)行比對,產(chǎn)生變化的即為運(yùn)動(dòng)的目標(biāo)像素塊

二、過程詳解:

1.將傳入的兩幀先進(jìn)行灰度處理,轉(zhuǎn)化將rgb類型圖片轉(zhuǎn)化為灰度圖,可大大降低處理時(shí)間和資源消耗

將轉(zhuǎn)換后的圖片轉(zhuǎn)存至frontGray和afterGray

cvtColor(frontFrame,frontGray,CV_BGR2GRAY);

cvtColor(afterFrame,afterGray,CV_BGR2GRAY);

2.將兩幀圖片進(jìn)行差幀處理

將有差別的像素轉(zhuǎn)存至diff

//幀差處理找到兩幀之間運(yùn)動(dòng)物體差異

//缺點(diǎn):會(huì)捕捉所有運(yùn)動(dòng)的物體,沒辦法專門捕捉某個(gè)目標(biāo)

absdiff(frontGray,afterGray,diff);

效果如下:

3.將圖像二值化,只有黑和白,便于計(jì)算機(jī)計(jì)算,但是會(huì)產(chǎn)生噪點(diǎn)(后續(xù)會(huì)進(jìn)行簡單的降噪操作)

//二值化:使其變得更加黑白分明,便于計(jì)算,會(huì)產(chǎn)生噪點(diǎn)

threshold(diff,diff,25,255,CV_THRESH_BINARY);

效果如下:

一個(gè)個(gè)單獨(dú)的小白點(diǎn)就是噪點(diǎn),是因?yàn)楣饩€反光和樹葉的晃動(dòng)

4.腐蝕處理,腐蝕掉x*x方塊大小的像素,我這里設(shè)置了4*4,清除大部分噪點(diǎn)

//腐蝕處理:去除大部分的白色噪點(diǎn)

Matelement=cv::getStructuringElement(MORPH_RECT,Size(4,4));

//小于4*4方塊的白色噪點(diǎn)都會(huì)被腐蝕

erode(diff,diff,element);

效果如下,噪點(diǎn)確實(shí)少了很多,但是運(yùn)動(dòng)的物體也被腐蝕掉了很多,可能會(huì)出現(xiàn)漏掉運(yùn)動(dòng)物體的情況

可以發(fā)現(xiàn),噪點(diǎn)幾乎沒有了,但是車輛的像素也被腐蝕了

5.膨脹處理,把去除過噪點(diǎn)的像素圖像膨脹,變大,我這里膨脹了30*30

//膨脹處理:將白色區(qū)域變"胖",便于識別

Matelement2=cv::getStructuringElement(MORPH_RECT,Size(30,30));

dilate(diff,diff,element2);

效果如下:

小像素變成大果粒了

6.將變動(dòng)過的像素目標(biāo)打上標(biāo)記(注意要在原幀上進(jìn)行標(biāo)記)

//動(dòng)態(tài)物體標(biāo)記

vectorvectorPointcontours;//用于保存關(guān)鍵點(diǎn)

findContours(diff,contours,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_SIMPLE,Point(0,0));

//提取關(guān)鍵點(diǎn)

vectorvectorPointcontours_poly(contours.size());

vectorRectboundRect(contours.size());

intx,y,w,h;

intnum=contours.size();

for(inti=0;ii++)

approxPolyDP(Mat(contours[i]),contours_poly[i],3,true);

boundRect[i]=boundingRect(Mat(contours_poly[i]));

x=boundRect[i].x;

y=boundRect[i].y;

w=boundRect[i].width;

h=boundRect[i].height;

//繪制

rectangle(resFrame,Point(x,y),Point(x+w,y+h),Scalar(0,255,0),2);

}

效果如下:

實(shí)際效果,偶爾有樹葉飄動(dòng)會(huì)產(chǎn)生一點(diǎn)點(diǎn)干擾

三、代碼

#includeiostream

#includeopencv2/opencv.hpp

usingnamespacecv;

usingnamespacestd;

MatmoveCheck(MatfrontFrame,MatafterFrame)

MatfrontGray,afterGray,diff;

MatresFrame=afterFrame.clone();

//灰度處理,節(jié)省運(yùn)算時(shí)間

cvtColor(frontFrame,frontGray,CV_BGR2GRAY);

cvtColor(afterFrame,afterGray,CV_BGR2GRAY);

//幀差處理找到兩幀之間運(yùn)動(dòng)物體差異

//缺點(diǎn):會(huì)捕捉所有運(yùn)動(dòng)的物體,沒辦法專門捕捉某個(gè)目標(biāo)

absdiff(frontGray,afterGray,diff);

//二值化:使其變得更加黑白分明,便于計(jì)算,會(huì)產(chǎn)生噪點(diǎn)

threshold(diff,diff,25,255,CV_THRESH_BINARY);

//腐蝕處理:去除大部分的白色噪點(diǎn)

Matelement=cv::getStructuringElement(MORPH_RECT,Size(4,4));//小于4*4方塊的白色噪點(diǎn)都會(huì)被腐蝕

erode(diff,diff,element);

//膨脹處理:將白色區(qū)域變"胖",便于識別

Matelement2=cv::getStructuringElement(MORPH_RECT,Size(30,30));

dilate(diff,diff,element2);

//動(dòng)態(tài)物體標(biāo)記

vectorvectorPointcontours;//用于保存關(guān)鍵點(diǎn)

findContours(diff,contours,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_SIMPLE,Point(0,0));

//提取關(guān)鍵點(diǎn)

vectorvectorPointcontours_poly(contours.size());

vectorRectboundRect(contours.size());

intx,y,w,h;

intnum=contours.size();

for(inti=0;ii++)

approxPolyDP(Mat(contours[i]),contours_poly[i],3,true);

boundRect[i]=boundingRect(Mat(contours_poly[i]));

x=boundRect[i].x;

y=boundRect[i].y;

w=boundRect[i].width;

h=boundRect[i].height;

//繪制

rectangle(resFrame,Point(x,y),Point(x+w,y+h),Scalar(0,255,0),2);

returnresFrame;

intmain(intargc,char*argv[])

Matframe;

Mattemp;

Matres;

intnum=0;

VideoCapturecap("D:/VideoTraining/carMove.mp4");

while(cap.read(frame))

num++;

if(num==1)

{//如果為第一幀則把當(dāng)前幀傳入(即不產(chǎn)生效果)

res=moveCheck(frame,frame);

else

{//從第二幀開始才有差幀

res=moveCheck(temp,frame);

temp=frame.clone();//此處注意要調(diào)用.clone深拷貝,否則會(huì)出現(xiàn)兩個(gè)畫面一

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(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

提交評論