幀差法是背景減圖法中的一種,只不過是幀差法不需要建模,因為它的背景模型就是上一幀的圖,所以速度非常快,另外幀差法對緩慢變換的光照不是很敏感,所以其用途還是有的,有不少學者對其做出了出色的改進。
其基本原理可以用下面公式看出:
|i(t)-i(t-1)||i(t)-i(t-1)|>=t 前景
其中i(t),i(t-1)分別為t,t-1時刻對應畫素點的畫素值,t為閾值。
當然其缺點也不少,容易出現」雙影」和」空洞」現象。
用opencv2.3.1+vs2010做了個簡單的實驗,其實驗**如下:
1實驗結果如下://frame_diff.cpp : 定義控制台應用程式的入口點。2//
34 #include "
stdafx.h
"5 #include 6 #include 7 #include 8
9#define threshold_diff 20 //
設定簡單幀差法閾值
1011
using
namespace
cv;12
using
namespace
std;
1314
int main(int argc,unsigned char*ar**)
1544
char c=(char)waitkey(10
);45
if (c==27)46
49if(c=='')
50 pause=!pause;51}
52return0;
53 }
可以看出其「雙影」和」空洞」比較明顯。雙影是由於幀差法有2個影子,在該試驗中就是輪廓變得很粗,」空洞」是由於物體內部顏色相近,檢測不出來。當然幀差法還有個致命的缺點那就是閾值t需要人工設定。
對於幀差法的」雙影」現象,有人提出來了三幀差法。其原理如下所示:
1. 由i(t)-i(t-1)得到前景圖 f1
2. 由i(t+1)-i(t)得到前景圖 f2
3. f1 ∩ f2得到前景圖 f3
4. 形態學處理
也就是利用2次相鄰幀的差,然後去與操作,就得到了真正的那個影子了。
這個在一定程度上可以解決」雙影」現象。
同樣做了個簡單的實驗,**如下:
1實驗結果如下://frame_3diff.cpp : 定義控制台應用程式的入口點。2//
34 #include "
stdafx.h
"5 #include 6 #include 7 #include 8
9#define threshold_diff1 10 //
設定簡單幀差法閾值
10#define threshold_diff2 10 //
設定簡單幀差法閾值
1112
using
namespace
cv;13
using
namespace
std;
1415
int main(int argc,unsigned char*ar**)
1655
bitwise_and(gray_diff1,gray_diff2,gray);
56 imshow("
foreground
",gray);57}
58char c=(char)waitkey(10
);59
if (c==27)60
63if(c=='')
64 pause=!pause;//
為什麼暫停不了??65}
66return0;
67 }
可以看出,效果並沒怎麼變好,只是影子輪廓確實變細了,」空洞」現象也沒有改善,當然這只是個簡單的實驗,也沒有優化或改進,用的是最原始的思想,沒有使用形態學做後期處理。
前景檢測演算法(八) SACON演算法
原文 sacon sample consensus 演算法是基於樣本一致性的運動目標檢測演算法。該演算法通過對每個畫素進行樣本一致性判斷來判定畫素是否為背景。演算法框架圖 由上圖可知,該演算法主要分為四個主要部分,分別是鄰域差分 sacon演算法核心處理 空洞填充後處理 tom time out m...
前景檢測演算法(十五) LOBSTER演算法
原文 基於區域性二值相似性模式 lbsp 的運動目標檢測演算法 kezunhai gmail.com improving background subtraction using local binary similarity patternswacv2014。在vibe中,演算法主要是基於畫素之間...
python opencv 幀差法目標檢測
author qq群686070107 import cv2 import numpy as np camera cv2.videocapture 0 引數0表示第乙個攝像頭 if camera.isopened print open else print 攝像頭未開啟 size int camer...