目標跟蹤(2) 背景分割器

2021-07-28 18:05:44 字數 4955 閱讀 1995

《opencv 3計算機視覺——python語言實現(原書第2版)》

第八章目標跟蹤

|______8.2背景分割器:knn、mog2、gmg

本節只是對書中**進行詳細解讀

opencv 提供了乙個稱為backgroundsubtractor的類,在分割前景和背景時很方便。該類不僅執行背景分割,且可以通過機器學習的方法提高背景檢測的效果,並提供將分類結果儲存到檔案的功能。

背景分割器主要包含 mog2、knn、gmg。

利用背景分割器mog2分割前景和背景,檢測運動物體

#!/usr/bin/env python3

#__*__coding=utf-8__*__

"""利用背景分割器mog2分割前景和背景,檢測運動物體

"""import numpy as np

import cv2

cap = cv2.videocapture(0)

mog = cv2.createbackgroundsubtractormog2()

while(1):

ret,frame = cap.read()

cv2.imshow('frame',fgmask)

if cv2.waitkey(100) & 0xff == ord("q"):

break

cap.release()

cv2.destroyallwindows()

#!/usr/bin/env python3

#__*__coding=utf-8__*__

import cv2

import numpy as np

#常見乙個backgroundsubtractorknn介面

bs = cv2.createbackgroundsubtractorknn(detectshadows=true)

camera = cv2.videocapture(0)

while true:

ret,frame = camera.read()

#獲得前景掩碼(含有白色值以及陰影的灰色值),通過設定閾值將非白色(244~255)的所有畫素都設為0,而不是1;

th = cv2.threshold(fgmask.copy(),244,255,cv2.thresh_binary)[1]

dilated = cv2.dilate(th,cv2.getstructuringelement(cv2.morph_ellipse,(3,3)),iterations =2)

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("mog",fgmask)

cv2.imshow("thresh",th)

cv2.imshow("detection",frame)

if cv2.waitkey(100) & 0xff == ord("q"):

break

camera.release()

cv2.destroyallwindows()

均值漂移是一種目標跟蹤演算法,該演算法尋找概率函式離散樣本的最大密度,並且重新計算在下一幀中的最大密度,該演算法給出了目標的移動方向。不但進行計算移動方向和距離,直到與原始中心匹配或者迭代後保持中心不變,即最後收斂。

參考部落格mean shift 均值漂移聚類

#!/usr/bin/env python3

#__*__coding=utf-8__*__

"""均值漂移

"""import cv2

import numpy as np

cap = cv2.videocapture(0)

ret,frame = cap.read()

#設定跟蹤視窗大小

r,h,c,w = 10,200,10,200

track_window = (c,r,w,h)

roi = frame[r:r+h, c:c+w]

hsv_roi = cv2.cvtcolor(frame,cv2.color_bgr2hsv)

#inrange函式用來設定下限和上限值

mask = cv2.inrange(hsv_roi,np.array((100.,30.,32.)),np.array((180.,120.,255.)))

roi_hist = cv2.calchist([hsv_roi],[0],mask,[180],[0,180])

cv2.normalize(roi_hist,roi_hist,0,255,cv2.norm_minmax)

term_crit = (cv2.term_criteria_eps | cv2.term_criteria_count,10,1)

while

true:

ret,frame = cap.read()

if ret == true:

hsv = cv2.cvtcolor(frame,cv2.color_bgr2hsv)

dst = cv2.calcbackproject([hsv],[0],roi_hist,[0,180],1)

ret,track_window = cv2.meanshift(dst,track_window,term_crit)

x,y,w,h = track_window

img2 = cv2.rectangle(frame,(x,y),(x+w,y+h),255,2)

cv2.imshow('img2',img2)

if cv2.waitkey(100) & 0xff == ord("q"):

break

else:

break

cap.release()

cv2.destroyallwindows()

**中有兩個不太容易理解的函式:

calchist函式

calcbackproject函式

camshift 會根據具體的旋轉來繪製標記矩陣框,這種旋轉會被跟蹤物件一起旋轉。

#!/usr/bin/env python3

#__*__coding=utf-8__*__

"""均值漂移

"""import cv2

import numpy as np

cap = cv2.videocapture(0)

ret,frame = cap.read()

#設定跟蹤視窗大小

r,h,c,w = 10,200,10,200

track_window = (c,r,w,h)

roi = frame[r:r+h, c:c+w]

hsv_roi = cv2.cvtcolor(frame,cv2.color_bgr2hsv)

#inrange函式用來設定下限和上限值

mask = cv2.inrange(hsv_roi,np.array((100.,30.,32.)),np.array((180.,120.,255.)))

roi_hist = cv2.calchist([hsv_roi],[0],mask,[180],[0,180])

cv2.normalize(roi_hist,roi_hist,0,255,cv2.norm_minmax)

term_crit = (cv2.term_criteria_eps | cv2.term_criteria_count,10,1)

while

true:

ret,frame = cap.read()

if ret == true:

hsv = cv2.cvtcolor(frame,cv2.color_bgr2hsv)

dst = cv2.calcbackproject([hsv],[0],roi_hist,[0,180],1)

###############均值漂移#########################

# ret,track_window = cv2.meanshift(dst,track_window,term_crit)

## x,y,w,h = track_window

# img2 = cv2.rectangle(frame,(x,y),(x+w,y+h),255,2)

##################camshift############################

ret, track_window =cv2.camshift(dst,track_window,term_crit)

pts = cv2.boxpoints(ret)

pts = np.int0(pts)

img2 = cv2.polylines(frame,[pts],true,255,2)

cv2.imshow('img2',img2)

if cv2.waitkey(100) & 0xff == ord("q"):

break

else:

break

camera.release()

cv2.destroyallwindows()

與meanshift只有四行程式不同。

對運動物體的跟蹤:

如果背景固定,可用幀差法 然後在計算下連通域,將面積小的去掉即可;

如果背景單一,即你要跟蹤的物體顏色和背景色有較大區別,可用基於顏色的跟蹤,如camshift 魯棒性都是較好的;

如果背景複雜,如背景中有和前景一樣的顏色,就需要用到一些具有**性的演算法 如卡爾曼濾波等 可以和 camshift 結合;

參考文件:

camshift的演算法原理

camshift跟蹤演算法介紹

Opencv背景分割器

opencv提供了乙個稱為backgroundsubtractor的類,在分割前景和背景時很方便。下面我們直接上 看一下它的使用方式。這裡提供python和c 兩種版本的code。python實現 1 匯入包 import numpy as np impport cv2cap cv2.videoca...

檔案分割器

2000年11月17日 10 11 00 檔案分割器 李光強 檔案分割器是個比較實用的工具。當我們要從別的電腦拷貝乙個大於一張磁碟容量的檔案或時就可以體會到它的好處。檔案分割器的原理其實很簡單,大體是這樣 先把想要分割的檔案的大小讀出來,再用它去除每張磁碟的容量,得出所需的磁碟數,然後就開始讀取檔案...

檔案分割器

using system using system.collections.generic using system.componentmodel using system.data using system.drawing using system.text using system.window...