日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python与OpenCV(二)——基于背景差分法的运动目标检测程序分析

發布時間:2024/3/13 python 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python与OpenCV(二)——基于背景差分法的运动目标检测程序分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

背景差分法是傳統運動目標檢測算法中最常用的方法。其基本原理如圖所示。

從圖中可知,背景差分法是通過建立背景模型,比較當前幀與背景模型對應像素的差異點來檢測運動目標的方法。
背景模型的建立主要通過兩種方式:一種是選取一幀不含運動目標的圖像作為背景模型;另一種是通過建立數學模型表示背景。
第一種簡單方便,但是在背景也有變化的場景中準確率不高,例如波動的水面、搖曳的樹葉、漂浮的云或煙霧、室內燈光突然打開或熄滅等情況;而通過建立數學模型表示背景相對來說學術性更強一些,需要借助數學工具按照背景元素運行的特性來構建模型,模型的準確性會直接影響識別的結果。
在本例當中,應用的是高斯混合模型

高斯混合模型

高斯模型就是用高斯概率密度函數也就是正態分布曲線來精確地量化事物,將一個事物分解為若干的基于高斯概率密度函數(正態分布曲線)而形成的模型。
對圖像背景建立高斯模型的原理及過程:圖像灰度直方圖反映的是圖像中某個灰度值出現的頻次,也可以認為是圖像灰度概率密度的估計。我們對所檢測的圖像區域與所定義的背景圖像區域的灰度值進行對比,如果檢測圖像區域與背景圖像區域在灰度分布上有一定的差異,那么該圖像區域的灰度直方圖會呈現雙峰-谷形狀,其中一個峰對應于檢測圖像區域的中心灰度值,另一個峰對應于背景圖像區域的中心灰度,也就是說,如果在灰度直方圖中出現了雙峰-谷形狀,我們就可以判定為該區域有運動目標出現。
在運動目標檢測中,我們需要建立的模型是背景的模型,那么在所檢測的視頻中,什么算是前景,什么算是背景呢。
我們常常把在視頻中可以認為不變的、靜止的那部分圖像看作是背景,而在視頻中有意義的運動的物體認為是前景。那么問題來了,因為環境的復雜性,我們希望不變的背景實際上是不停的小幅變化著的,所以對背景建模就是讓原來定義的靜止不動的背景模型呈現出一定的變化趨勢,這個變化趨勢就是讓定義的背景幀能體現當前背景的基本特性。基本方法就是利用當前幀和視頻序列中的當前背景幀進行加權平均來更新背景,而這一過程并非容易,所以利用高斯混合模型(GMM,Gaussian mixture model)是目前最成功的方法之一。
高斯混合模型使用K(基本為3到5個) 個高斯模型來表征圖像中各個像素點的基本特征,。基本思路是我們在每獲得新一幀圖像時就更新高斯混合模型,常用方差和均值兩個參數來更新模型,然后用當前圖像中的每個像素點與更新后的高斯混合模型進行匹配,如果匹配成功則判定該點為背景點, 否則為前景點。
整個方法思路清晰,但是也可以看出,在更新模型時所確定的兩個參數方差和均值成為問題的關鍵,而這兩個參數的確定方法才是整個算法的靈魂。對于采取不同的學習機制而形成的均值和方差,將直接影響到模型的穩定性、精確性和收斂性。

Python源碼

OpenCV提供了基本的高斯混合模型方法,我們就使用它來進行識別,先上源碼:

import cv2 import numpy as np# 第一步:使用cv2.VideoCapture讀取視頻 camera = cv2.VideoCapture(0) # 判斷視頻是否打開 if (camera.isOpened()):print('攝像頭已打開') else:print('攝像頭未打開')size = (int(camera.get(cv2.CAP_PROP_FRAME_WIDTH)),int(camera.get(cv2.CAP_PROP_FRAME_HEIGHT))) print('size:'+repr(size))# 第二步:cv2.getStructuringElement構造形態學使用的kernel kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3)) # 第三步:構造高斯混合模型 model = cv2.createBackgroundSubtractorMOG2()while(True):# 第四步:讀取視頻中的圖片,并使用高斯模型進行擬合ret, frame = camera.read()# 運用高斯模型進行擬合,在兩個標準差內設置為0,在兩個標準差外設置為255fgmk = model.apply(frame)# 第五步:使用形態學的開運算做背景的去除fgmk = cv2.morphologyEx(fgmk, cv2.MORPH_OPEN, kernel)# 第六步:cv2.findContours計算fgmk的輪廓contours, hierarchy = cv2.findContours(fgmk.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 該函數計算一幅圖像中目標的輪廓for c in contours:if cv2.contourArea(c) < 1500:continue(x, y, w, h) = cv2.boundingRect(c) # 該函數計算矩形的邊界框cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)# 第八步:進行圖片的展示cv2.imshow('fgmk', fgmk)cv2.imshow('frame', frame)if cv2.waitKey(150) & 0xff == 27:breakcap.release() cv2.destroyAllWindows()

源碼分析

這次只分析幾句,其他的在《Python與OpenCV(一)——基于幀差法的運動目標檢測程序分析》中已經解釋過了,我們只解釋這幾句的含義及知識點。
第一句:

model = cv2.createBackgroundSubtractorMOG2()

這句話表示進行構建高斯混合模型,BackgroundSubtractorMOG2是指以高斯混合模型為基礎的背景/前景分割算法。這個算法的一個特點是它為每一個像素選擇一個合適數目的高斯分布,這樣就會對由于亮度等發生變化引起的場景變化產生更好的適應。具體的思路是:例如樹葉晃動,樹葉晃出某位置時,該位置的像素信息用一個高斯模型表示,樹葉晃到該位置時,用另一個高斯模型表示該位置的像素信息,這樣新的圖片的像素不論與哪個高斯模型匹配都視為背景,防止模型將樹葉晃動視為運動目標,增加模型的魯棒性。
高斯混合模型(GMM)是背景建模中的經典算法。基本版本的GMM,opencv將其封裝為BackgroundSubtractorMOG,而我們所用到的BackgroundSubtractorMOG2是opencv將改進版的GMM進行封裝,相比于BackgroundSubtractorMOG算法,主要有兩點改進:(1)增加陰影檢測功能,以便產生將陰影識別為前景物體的情況發生。

第二句:

fgmk = model.apply(frame)

這句話表示對獲取到的圖像frame使用高斯混合模型,并將其結果賦值給fgmk。

第三句:

fgmk = cv2.morphologyEx(fgmk, cv2.MORPH_OPEN, kernel)

這句話是將fgmk以我們構造形態學的kernel,通過形態學運算的開運算,進行背景的去除,也可以稱為對fgmk的降噪處理。fgmk是我們傳入的需要處理降噪的圖像,cv2.MORPH_OPEN是進行變換的方式,采用的是形態學運算中的開運算,kernel是我們構造的形態學內核,就是在前面kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3))所指定的。

圖形形態學

我們對二值圖進行降噪處理,圖像形態學中的腐蝕和膨脹能夠很好的幫助我們解決此問題。腐蝕的具體操作是用一個結構元素(代碼中的kernel)掃描圖像中的每一個像素,用結構元素中的每一個像素與其覆蓋的像素做“與”操作,如果都為1,則該像素為1,否則為0。膨脹的具體操作是用一個結構元素掃描圖像中的每一個像素,用結構元素中的每一個像素與其覆蓋的像素做“與”操作,如果都為0,則該像素為0,否則為1。結構元素的大小會對圖像處理的效果產生影響。腐蝕的作用是消除物體邊界點,使目標縮小,可以消除小于結構元素的噪聲。膨脹的作用是將與物體接觸的所有背景點合并到物體中,使目標增大,可添補目標中的空洞。
1)morphologyEx函數可取標識符列舉:
MORPH_OPEN – 開運算(Opening operation)
MORPH_CLOSE – 閉運算(Closing operation)
MORPH_GRADIENT - 形態學梯度(Morphological gradient)
MORPH_TOPHAT - 頂帽(Top hat)
MORPH_BLACKHAT - 黑帽(Black hat)
MORPH_ERODE - 腐蝕
MORPH_DILATE - 膨脹
2)開運算
本次代碼中用的是形態學運算中的開運算(MORPH_OPEN),開運算是先腐蝕后膨脹的過程,可以消除圖像上細小的噪聲,除去孤立的小點和毛刺,并平滑物體邊界。
3)閉運算
形態學運算中的閉運算(MORPH_CLOSE)與開運算相反,閉運算是先膨脹后腐蝕,可以填充物體內細小的空洞,彌合小裂縫,并平滑物體邊界。
4)形態學梯度(MORPH_GRADIENT):
梯度= 膨脹 - 腐蝕
形態學梯度為經過膨脹操作與經過腐蝕操作的差,可以用于抽出物體的邊緣。對二值圖像進行形態學梯度操作可以將團塊的邊緣突出出來,可以用形態梯度來保留物體的邊緣輪廓。
5)頂帽
頂帽(MORPH_TOPHAT):表示的是原始圖像-開運算(先腐蝕再膨脹)以后的圖像。開運算帶來的結果是放大了裂縫或者局部低亮度區域。原圖減去開運算后的圖,得到的效果圖突出了比原圖輪廓周圍區域更明亮的區域。
不均勻亮度情況下,二值處理后的較亮邊緣物體因為亮度偏高,導致二值后數據損失,通過頂帽運算,尋找邊緣。頂帽變換適用于暗背景上的亮物體。頂帽運算,對卷積核比較敏感,卷積核一般選全1。
6)黑帽
黑帽(MORPH_BLACKHAT):
表示的是閉運算(先膨脹再腐蝕)后的圖像 - 原始圖像。黑帽運算后效果圖突出了比原圖輪廓周圍的區域更暗的區域,所以,黑帽運算用來分離比鄰近點暗一些的斑塊,效果圖會有完美的輪廓。黑帽運算,對卷積核比較敏感,卷積核一般選全1。

總結

以上是生活随笔為你收集整理的Python与OpenCV(二)——基于背景差分法的运动目标检测程序分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。