python-opencv 實現最簡單的目標跟蹤的demo

通過顏色特徵 來實現最最簡單的目標跟蹤的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是所畫的線的寬度

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章