關於幀差法的想法(opencv)

2021-09-25 09:43:53 字數 1419 閱讀 3031

當我們要提取前景時,幀差法基本上是最簡單的一種方法了,變化緩慢的背景,以及運動較快的物體,在進行幀差法之後,進行閾值分割,將差值影象變成二值影象,就完成了運動目標以及背景的分離。

本文主要講一下最簡單的幀差,三幀差法原理相差不大,對稱差分就不講了。

公式如下:

我簡單編寫了乙個幀差法及閾值分割的程式如下:

#include #includeusing namespace std;

using namespace cv;

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

//測試資料是否讀入

mat temp, pre, current, result;

mat element = getstructuringelement(morph_rect, size(3, 3));//結構元素

mat image1, image2;

mat after_midfiler;

//mat bsmaskmog2;

int num = 0;

///ptrpmog2 = createbackgroundsubtractormog2();

while (1)

if (num > 1)}}

當運動物體變化很慢時,前面已經說過幀差會產生空洞,再進行閾值分割,這些部分會被當做背景處理。思考了一下,每一幀的變化很慢,但是總是會有變化的,如果將這每一幀與第一幀進行差分會有什麼結果?

(注釋掉**cvtcolor(temp, pre, color_bgr2gray);即可)

嘗試的執行結果如下:

這裡的結果明顯清晰了許多,因為後面魚的位置與第一幀相比有了很大的區別,然而這裡的問題是,第一幀中的魚干擾了結果,本來只有兩條,幀差之後變成了四條。

再上面的基礎上進行優化,思路是想辦法將第一幀中的魚去掉,只留下魚缸。也就是嘗試進行簡單的背景建模。

我的具體做法是,將當前每一幀與第一幀進行逐個畫素的對比,由於魚的游動,每一畫素點都會存在沒有魚的時刻,想辦法將這些不同時刻的畫素點整合到一幀裡就可以。我用的**如下:

for (int i = 0;i < current.rows;i++)

}

執行效果如下:

分割線,後續針對幀差法的優化措施待更新~~~~~~~~~~~~~

OpenCV實現幀差法

幀差法的優勢是運算量小,實時性好,可以獲得不錯的輪廓。缺點是不夠精細,閾值過高容易漏檢,過低則無法做到noise tolerance.另外如果發生光照突變等情況,幀差法會把整副影象當成運動區域。以下是實現的 include highgui.h include cv.h void main if fr...

Open CV 三幀差法

首先 去連續三幅圖定義為 其中image1 image2 做幀的差值運算 image2 image3 做幀的差值運算 並將他們差值做平滑處理和閾值處理 轉化成二值影象 然後將其進行位與運算得出結果result include highgui.h include cv.h include cxcore...

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

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