通過顏色特徵 來實現最最簡單的目標跟蹤的demo,適用於很簡單的場景,並且被跟蹤的目標要與背景顏色要有區分,這個demo只是對目標跟蹤的入門者的一個小例子吧,就好像學一門語言第一個學會的就是輸出“hello world”
我特意錄了一個非常簡單的視頻,來跟蹤這個綠色的蓋子,視頻截圖如下:
import cv2
import numpy as np
font = cv2.FONT_HERSHEY_SIMPLEX #字體的選擇
lower_green = np.array([35, 110, 106]) # 綠色範圍低閾值
upper_green = np.array([77, 255, 255]) # 綠色範圍高閾值
cap = cv2.VideoCapture('green.mp4')#讀入視頻
cv2.namedWindow('tracking')#創建一個窗口來放我們的視頻
while(cap.isOpened()): #判斷視頻是否讀入成功
ret, frame = cap.read() #若成功,讀入每一幀
if not ret: #若失敗,則退出
break
frame_HSV = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) #將每一幀的圖像轉成hsv
mask_frame = cv2.inRange(frame_HSV, lower_green, upper_green)
#cv2.inRange函數會將位於兩個區域間的值置爲255,位於區間外的值置爲0
mask_frame = cv2.medianBlur(mask_frame, 7)
#cv2.medianBlur進行中值濾波,去除一些噪聲點
mask_frame, contours, hierarchy = cv2.findContours(mask_frame, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)#解釋看下文
for cnt in contours:
(x, y, w, h) = cv2.boundingRect(cnt)#解釋看下文
cv2.rectangle(frame, (x,y), (x+w, y+h), (0,255,255), 2)#解釋看下文
cv2.putText(frame,'Green',(x, y+5), font, 0.7, (0, 255, 0), 2)#解釋看下文
cv2.imshow('tracking', frame)
c = cv2.waitKey(1) & 0xFF
if c == 27 or c == ord('q'): # 判斷按鍵,如果按鍵爲q或esc,退出循環
break
cv2.waitKey()
cv2.destroyAllWindows()
跟蹤結果:
cv2.findContours()函數:
示例代碼:mask_frame, contours, hierarchy = cv2.findContours(mask_frame, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
輸入的參數:
mask_frame:帶有輪廓信息的圖像
cv2.RETR_EXTERNAL:輸出輪廓中只有外側輪廓信息
cv2.CHAIN_APPROX_NONE:存儲輪廓所有點的信息,相鄰兩個輪廓點在圖象上也是相鄰的
輸出:
返回的三個值:mask_frame,contours,hierarchy
mask_frame:可能是跟輸入contour類似的一張二值圖;
contours:list結構,列表中每個元素代表一個邊沿信息。每個元素是(x,1,2)的三維向量,x表示該條邊沿裏共有多少個像素點,第三維的那個“2”表示每個點的橫、縱座標;
hierarchy:返回類型是(x,4)的二維ndarray。x和contours裏的x是一樣的意思,hierarchy的四列分別對應下一個輪廓編號、上一個輪廓編號、父輪廓編號、子輪廓編號,該值爲負數表示沒有對應項。
cv2.boundingRect(img)函數:
詳見:https://blog.csdn.net/fjswcjswzy/article/details/105845142
img是一個二值圖,也就是它的參數;返回四個值,分別是x,y,w,h;
x,y是矩陣左上點的座標,w,h是矩陣的寬和高
cv2.rectangle函數:
詳見:https://blog.csdn.net/fjswcjswzy/article/details/105845557
cv2.rectangle(frame, (x,y), (x+w, y+h), (0,255,255), 2)
第一個參數:frame是原圖
第二個參數:(x,y)是矩陣的左上點座標
第三個參數:(x+w,y+h)是矩陣的右下點座標
第四個參數:(0,255,255)是畫線對應的rgb顏色
第五個參數:2是所畫的線的寬度