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

2021-10-03 15:59:11 字數 3341 閱讀 4136

上圖使用absdiff影象減法函式,**如下:

//二值化腐蝕膨脹學習,幀差法和背景差法對比測試

#include#includeusing namespace cv;

using namespace std;

int main(int argc, char** ar**)

幀差法也是使用absdiff影象減法函式,只不過是相鄰幀影象相減(下圖假設是相鄰幀,笑臉從左往右移動到飛機尾部),找出差異的部分。例如下面兩個影象的例子:

**如下(實際上和上面**是一樣的,只是為了突出對比一下):

//二值化腐蝕膨脹學習,幀差法和背景差法對比測試

檢測效果較好,檢測出來的差異基本上就是車輛的樣子,但是要知道,如果運動目標非常快,就會出現和上面實驗一樣,出現這種情況:

**如下:

///運動物體檢測——幀差法、缺點是無法對運動後突然又靜止的景象進行識別,優點是光照不影響;

#include "opencv2/opencv.hpp"

using namespace cv;

#include using namespace std;

//運動物體檢測函式宣告

mat movedetect(mat temp, mat frame);

int main()

int framecount = video.get(cv_cap_prop_frame_count);//獲取幀數

double fps = video.get(cv_cap_prop_fps);//獲取fps

mat frame;//儲存幀

mat temp;//儲存前一幀影象

mat result;//儲存結果影象

for (int i = 0; i < framecount; i++)

int frameposition = video.get(cv_cap_prop_pos_frames);//獲取幀位置(第幾幀)

cout << "frameposition: " << frameposition << endl;

if (i == 0) //如果為第一幀(temp還為空)

absdiff(frame, frame, result);

else //若不是第一幀(temp有值了)

absdiff(temp, frame, result);//2.將前一幀temp影象和當前幀frame影象做差

imshow("result", result);

if (waitkey(1000.0 / fps) == 27)//按原fps顯示

temp = frame.clone();//當前幀賦給temp作為下一幀的前一幀

} return 0;

}

再來看看背景差法(使用第一幀做背景)

現在我們雖然把前景(檢測目標)提取出來了, 我們需要將這些目標的輪廓畫出來, 並用矩形框標識出來。

//二值化腐蝕膨脹學習,幀差法和背景差法對比測試

#include#includeusing namespace cv;

using namespace std;

int main(int argc, char** ar**)

//輪廓的顏色;輪廓線條的粗細預設為1

imshow("9繪製正外接矩形", frame);

waitkey(0);

return 0;

}

最後來看乙個幀差法檢測運動目標的完整**:

完整**如下:

///運動物體檢測——幀差法、缺點是無法對運動後突然又靜止的景象進行識別,優點是光照不影響;

#include "opencv2/opencv.hpp"

using namespace cv;

#include using namespace std;

//運動物體檢測函式宣告

mat movedetect(mat temp, mat frame);

int main()

int framecount = video.get(cv_cap_prop_frame_count);//獲取幀數

double fps = video.get(cv_cap_prop_fps);//獲取fps

mat frame;//儲存幀

mat temp;//儲存前一幀影象

mat result;//儲存結果影象

for (int i = 0; i < framecount; i++)

int frameposition = video.get(cv_cap_prop_pos_frames);//獲取幀位置(第幾幀)

cout << "frameposition: " << frameposition << endl;

if (i == 0)//如果為第一幀(temp還為空)

else//若不是第一幀(temp有值了)

imshow("result", result);

if (waitkey(1000.0 / fps) == 27)//按原fps顯示

temp = frame.clone();//當前幀賦給temp作為下一幀的前一幀

} return 0;

}mat movedetect(mat temp, mat frame)

return result;//返回result

}

運動目標檢測OpenCV背景減除法

背景減除法 1.gmm mog2演算法,高斯混合模型分離演算法,它為每個畫素選擇適當數量的高斯分布 函式 cv2.createbackgroundsubtractormog2 int history 500,double varthread 16,bool detectshadows true 2....

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...