Python OpenCV 3 使用背景減除進行目標檢測

背景減除(Background Subtraction)是許多基于計算機視覺的任務中的主要預處理步驟瘪阁。如果我們有完整的靜止的背景幀管跺,那么我們可以通過幀差法來計算像素差從而獲取到前景對象伙菜。但是在大多數(shù)情況下贩绕,我們可能沒有這樣的圖像壶愤,所以我們需要從我們擁有的任何圖像中提取背景。當運動物體有陰影時娇哆,由于陰影也在移動,情況會變的變得更加復雜碍讨。為此引入了背景減除算法蒙秒,通過這一方法我們能夠從視頻中分離出運動的物體前景覆获,從而達到目標檢測的目的弄息。 OpenCV已經(jīng)實現(xiàn)了幾種非常容易使用的算法摹量。

環(huán)境

  • Python 3.6
  • OpenCV 3.2 + contrib

在Python下可以通過直接導入wheel包來安裝opencv+contrib,可以從下面這個網(wǎng)址下載對應的文件:opencv_python?3.2.0+contrib?cp36?cp36m?win_amd64.whl
http://www.lfd.uci.edu/~gohlke/pythonlibs/

KNN

KNN算法,即K-nearest neigbours - based Background/Foreground Segmentation Algorithm。2006年缨称,由Zoran Zivkovic 和Ferdinand van der Heijden在論文"Efficient adaptive density estimation per image pixel for the task of background subtraction."中提出废亭。

bs = cv2.createBackgroundSubtractorKNN(detectShadows=True)

fg_mask = bs.apply(frame)  
knn.jpg

MOG

MOG算法,即高斯混合模型分離算法具钥,全稱Gaussian Mixture-based Background/Foreground Segmentation Algorithm豆村。2001年,由P.KadewTraKuPong和R.Bowden在論文“An improved adaptive background mixture model for real-time tracking with shadow detection”中提出骂删。它使用一種通過K高斯分布的混合來對每個背景像素進行建模的方法(K = 3?5)掌动。

bs = cv2.bgsegm.createBackgroundSubtractorMOG(history=history)
bs.setHistory(history)

fg_mask = bs.apply(frame)  
mog.jpg

MOG2

MOG2算法,也是高斯混合模型分離算法宁玫,是MOG的改進算法粗恢。它基于Z.Zivkovic發(fā)布的兩篇論文,即2004年發(fā)布的“Improved adaptive Gausian mixture model for background subtraction”和2006年發(fā)布的“Efficient Adaptive Density Estimation per Image Pixel for the Task of Background Subtraction”中提出佛掖。該算法的一個重要特征是 它為每個像素選擇適當數(shù)量的高斯分布,它可以更好地適應不同場景的照明變化等。

bs = cv2.createBackgroundSubtractorMOG2(history=history, detectShadows=True)
bs.setHistory(history)

fg_mask = bs.apply(frame) 
mog2.jpg

GMG

該算法結(jié)合統(tǒng)計背景圖像估計和每像素貝葉斯分割。由 Andrew B. Godbehere, Akihiro Matsukawa, Ken Goldberg在2012年的文章“Visual Tracking of Human Visitors under Variable-Lighting Conditions for a Responsive Audio Art Installation”中提出焊切。該算法使用前幾個(默認為120)幀進行后臺建模。它采用概率前景分割算法,使用貝葉斯推理識別可能的前景對象芽死。

bs = cv2.bgsegm.createBackgroundSubtractorGMG(initializationFrames=history)

fg_mask = bs.apply(frame) 
gmg.jpg

使用KNN根據(jù)前景面積檢測運動物體

代碼:

# coding:utf8
import cv2


def detect_video(video):
    camera = cv2.VideoCapture(video)
    history = 20    # 訓練幀數(shù)

    bs = cv2.createBackgroundSubtractorKNN(detectShadows=True)  # 背景減除器落萎,設置陰影檢測
    bs.setHistory(history)

    frames = 0

    while True:
        res, frame = camera.read()

        if not res:
            break

        fg_mask = bs.apply(frame)   # 獲取 foreground mask

        if frames < history:
            frames += 1
            continue

        # 對原始幀進行膨脹去噪
        th = cv2.threshold(fg_mask.copy(), 244, 255, cv2.THRESH_BINARY)[1]
        th = cv2.erode(th, cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3)), iterations=2)
        dilated = cv2.dilate(th, cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (8, 3)), iterations=2)
        # 獲取所有檢測框
        image, contours, hier = cv2.findContours(dilated, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

        for c in contours:
            # 獲取矩形框邊界坐標
            x, y, w, h = cv2.boundingRect(c)
            # 計算矩形框的面積
            area = cv2.contourArea(c)
            if 500 < area < 3000:
                cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)

        cv2.imshow("detection", frame)
        cv2.imshow("back", dilated)
        if cv2.waitKey(110) & 0xff == 27:
            break
    camera.release()


if __name__ == '__main__':
    video = 'person.avi'
    detect_video(video)

效果:

detect.jpg
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末枚驻,一起剝皮案震驚了整個濱河市晾剖,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌绵估,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蛇数,死亡現(xiàn)場離奇詭異倚评,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門焕襟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拄衰,“玉大人妖混,你說我怎么就攤上這事抬旺∪履” “怎么了振坚?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵屎鳍,是天一觀的道長孵坚。 經(jīng)常有香客問我卖宠,道長扛伍,這世上最難降的妖魔是什么作媚? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任栏饮,我火速辦了婚禮逢享,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘粥血。我一直安慰自己燕侠,他們只是感情好,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布立莉。 她就那樣靜靜地躺著绢彤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蜓耻。 梳的紋絲不亂的頭發(fā)上茫舶,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天,我揣著相機與錄音刹淌,去河邊找鬼饶氏。 笑死,一個胖子當著我的面吹牛有勾,可吹牛的內(nèi)容都是我干的疹启。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼蔼卡,長吁一口氣:“原來是場噩夢啊……” “哼喊崖!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起雇逞,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤荤懂,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后塘砸,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體节仿,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年掉蔬,在試婚紗的時候發(fā)現(xiàn)自己被綠了廊宪。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片矾瘾。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖箭启,靈堂內(nèi)的尸體忽然破棺而出壕翩,到底是詐尸還是另有隱情,我是刑警寧澤册烈,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布戈泼,位于F島的核電站婿禽,受9級特大地震影響赏僧,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜扭倾,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一淀零、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧膛壹,春花似錦驾中、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至链方,卻和暖如春持痰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背祟蚀。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工工窍, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人前酿。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓患雏,卻偏偏與公主長得像,于是被迫代替她去往敵國和親罢维。 傳聞我的和親對象是個殘疾皇子淹仑,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容