《opencv 3計算機視覺——python語言實現(原書第2版)》opencv 提供了乙個稱為backgroundsubtractor的類,在分割前景和背景時很方便。該類不僅執行背景分割,且可以通過機器學習的方法提高背景檢測的效果,並提供將分類結果儲存到檔案的功能。第八章目標跟蹤
|______8.2背景分割器:knn、mog2、gmg
本節只是對書中**進行詳細解讀
背景分割器主要包含 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 會根據具體的旋轉來繪製標記矩陣框,這種旋轉會被跟蹤物件一起旋轉。
與meanshift只有四行程式不同。#!/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()
對運動物體的跟蹤:參考文件:如果背景固定,可用幀差法 然後在計算下連通域,將面積小的去掉即可;
如果背景單一,即你要跟蹤的物體顏色和背景色有較大區別,可用基於顏色的跟蹤,如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...