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影象減法函式,只不過是相...