Opencv之二幀差法運動目標檢測與輪廓提取

2021-07-16 23:39:26 字數 3098 閱讀 1832

opencv學習之——二幀差法運動目標檢測與輪廓提取

這是我的第一篇csdn博文。

**是從網上摘抄學習的,加了好多注釋,感覺就像邊看書邊做筆記一樣,給人以滿足的享受。let』s do this!

#include "highgui.h"

#include "cv.h"

#include "stdio.h"

#include

#include

#include

const

double mhi_duration=0.1;//運動跟蹤的最大持續時間0.1s

const

double max_time_delta=0.5

//最大時間增量0.5s

const

double min_time_delta=0.05;//最小時間增量0.05s

const

int n=3;

const

int contour_max_aera=16;

/*做幀差時要用到的影象緩衝*/

iplimage **buf=0;

int last=0;

/*臨時影象*/

iplimage* mhi=0;//運動歷史影象mhi

cvconnectedcomp* cur_comp,mincomp;

/*typedef struct cvconnectedcomp

;*//*定義乙個記憶體儲存器*/

cvmemstorage* storage;

/*二維座標系下的點,型別為整型,通常以0點為原點,有x、y座標*/

cvpoint pt[4];

/*當前畫面索引*/

int ncurframeindex=0;

/*定義用來更新運動歷史影象的函式*/

void update(iplimage *img,iplimage *dst,int diff_threshold)

/*若buf已經初始化了,也將buf置零*/

for(i=0;i1);

cvzero(buf[i]);

}/*重新初始化運動歷史影象mhi*/

cvreleaseimage(&mhi);

mhi=cvcreateimage(size,ipl_depth_32f,1);

cvzero(mhi);

}/*將當前要處理的幀轉化為灰度圖,放到buf的最後一幀*/

cvcvtcolor(img,buf[last],cv_bgr2gray);

/*這三部是為了做幀差,讓buf[idx1]永遠儲存的是上一幀,buf[idx2]儲存當前幀*/

idx1=last;

idx2=(last+1)%n;

last=idx2;

/*做幀差,函式 cvabsdiff 計算兩個陣列差的絕對值*/

nimg=buf[idx2];

cvabsdiff(buf[idx1],buf[idx2],nimg);

/*幀差之後,將得到的影象二值化*/

cvthreshold(nimg,nimg,50,255,cv_thresh_binary);

/*去掉超時的影像以更新運動歷史影象*/

cvupdatemotionhistory(nimg,mhi,timestamp,mhi_duration);

cvconvert(mhi,dst);

/*中值濾波,消除小的雜訊

函式cvpyrdown使用gaussian金字塔分解對輸入影象向下取樣,去除雜訊,影象是原影象的四分之一

函式cvdialate做膨脹操作,去除目標的不連續空洞

函式cvpyrup使用gaussian金字塔分解對輸入影象向上取樣,恢復影象,圖象是原影象的四倍*/

cvsmooth(dst,dst,cv_median,3,0,0,0);

cvpyrdown(dst,pyr,cv_gaussian_5x5);

cvdilate(pyr,pyr,0,1);

cvpyrup(pyr,dst,cv_gaussian_5x5);

/*建立輪廓*/

stor=cvcreatememstorage(0);

seq=cvcreateseq(cv_seq_eltype_point,//從預定義的序列型別中選擇一合適的型別

sizeof(cvseq),//此引數表示序列頭部的大小;必須大於或等於sizeof(cvseq)

/*第三個引數是元素的大小,以位元組計。這個大小必須與序列型別(由seq_flags指定)相一致,例如,對於乙個點的序列,元素型別 cv_seq_eltype_point應當被指定,引數elem_size必須等同於sizeof(cvpoint)。

*/sizeof(cvpoint),

stor);//指向前面定義的記憶體儲存器的指標

/*找到所有輪廓*/

cvfindcontours(dst,//源二值影象

stor,//返回輪廓的容器

&seq,//輸出引數,第乙個外接輪廓的位址。

sizeof(cvcontour),

cv_retr_external,//mode:external——只查詢最外的輪廓

cvpoint(0,0));

/*直接用contour中的矩形來畫輪廓*/

/*遍歷seq序列*/

for(;seq;seq=seq->h_next)

}/*函式呼叫完畢,釋放記憶體*/

cvreleasememstorage(&stor);

cvreleaseimage(&pyr);

}int main(int argc,char**argv)

}/*若取出了新的一幀,而且motion不為空,則更新畫面*/

update(image,motion,10);

/*顯示處理過的影象*/

cvshowimage("motion",image);

/*10ms內檢測到使用者按了任意鍵,均退出*/

if(cvwaitkey(10)>=0)

break;

}cvreleasecapture(&capture);

cvdestroywindow("motion");

}return

0;}

OpenCV之幀差法檢測運動目標

今天的目標是用opencv實現對運動目標的檢測,這裡選用三幀幀差法。如下 include include include include include double threshold index 0 const int contour max aera 200 void trackbar int...

OpenCV實現幀差法檢測運動目標

今天的目標是用opencv實現對運動目標的檢測,這裡選用三幀幀差法。如下 include include include include include double threshold index 0 const int contour max aera 200 void trackbar int...

OpenCV運動目標檢測背景差法和幀差法的理解

上圖使用absdiff影象減法函式,如下 二值化腐蝕膨脹學習,幀差法和背景差法對比測試 include includeusing namespace cv using namespace std int main int argc,char ar 幀差法也是使用absdiff影象減法函式,只不過是相...