首頁>技術>

二、瞭解OpenCV中使用inRange進行物件跟蹤2.1 瞭解色彩空間的轉換為什麼那麼重要

上一節中,我們瞭解了色彩空間的轉換,那為什麼要了解色彩空間?上一節中並沒有進行說明,這一節將透過色彩空間的轉換,使我們能夠對一些物件進行追蹤;這一節所需要轉換的色彩空間是HSV色彩空間,在HSV色彩空間中,不同的顏色有不同的取值範圍,透過這些範圍可以對一些指定顏色進行過濾捕獲,從而實現跟蹤。

首先我們檢視一下HSV色彩空間中,一般顏色的取值範圍。HSV存在3個通道,我們以下為黑白灰、紅橙黃綠青藍紫顏色的三個通道取值範圍;我們瞭解了取值範圍後將有利於我們對這些顏色的取值:黑:

H低值為 0,S低值為 0,V低值為 0H高值為 180,S高值為 255,V高值為 46

白:

H低值為 0,S低值為 0,V低值為 221H高值為 180,S高值為 30,V高值為 255

灰:

H低值為 0,S低值為 0,V低值為 46H高值為 180,S高值為 43,V高值為 220

紅:

H低值為 156,S低值為 43,V低值為 46H高值為 180,S高值為 255,V高值為 255

橙:

H低值為 11,S低值為 43,V低值為 46H高值為 25,S高值為 255,V高值為 255

黃:

H低值為 26,S低值為 43,V低值為 46H高值為 34,S高值為 255,V高值為 255

綠:

H低值為 35,S低值為 43,V低值為 46H高值為 77,S高值為 255,V高值為 255

青:

H低值為 78,S低值為 43,V低值為 46H高值為 99,S高值為 255,V高值為 255

藍:

H低值為 100,S低值為 43,V低值為 46H高值為 124,S高值為 255,V高值為 255

紫:

H低值為 125,S低值為 43,V低值為 46H高值為 155,S高值為 255,V高值為 255

我們可以根據以上的值,使用inRange方法對圖片的物件進行過濾,或者說跟蹤,如果使用以上的顏色取值範圍,有個先行條件,需要對圖片進行HSV轉換。

2.2 使用inRange對影象進行捕獲

在python中,使用inRange方法可以對圖片進行過濾,從而捕獲我們需要捕獲的內容。inRange方法需要傳入3個引數,第一個是影象;第二個是一個下限,這個下限指你需要捕獲的目標顏色的取值低值;第三個是一個上限,指你需要捕獲的目標顏色取值上限值。下限與上限都是陣列。

現在我們有如下圖片:

以上圖片共有3種顏色,白色、黑色、綠色。現在我需要捕獲黑色,那該如何去做呢?這時我們透過2.1節中得知,黑色的H、S、V低值分別是0、0、0,高值分別是180、255、46。我們建立兩個數值,一個儲存低值一個儲存高值。程式碼如下:

min=np.array([0,0,0])max=np.array([180,255,46])

這時我們先獲取圖片,並且引入numpy,不然np未引入將會出錯:

import cv2import numpy as npimg = cv2.imread(r'C:\Users\mx\Desktop\test.jpg')cv2.namedWindow("Image",cv2.WINDOW_NORMAL)cv2.namedWindow("flag",cv2.WINDOW_NORMAL)

以上程式碼建立的Image視窗用於顯示正常的圖片,flag視窗顯示我們捕獲後的目標圖片。隨後將圖片進行HSV轉換:

hsv_img=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)

隨後將建立的陣列,以及將轉換後的圖片傳入inRange方法中:

min=np.array([0,0,0])max=np.array([180,255,46])flag=cv2.inRange(hsv_img,lowerb=min,upperb=max)

接著顯示以及等待:

cv2.imshow("Image", img)cv2.imshow("flag", mask)cv2.waitKey (0)cv2.destroyAllWindows()

為了方便大家檢視,以下貼出了完整程式碼:

import cv2import numpy as npimg = cv2.imread(r'C:\Users\mx\Desktop\test.jpg')cv2.namedWindow("Image",cv2.WINDOW_NORMAL)cv2.namedWindow("flag",cv2.WINDOW_NORMAL)hsv_img=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)min=np.array([0,0,0])max=np.array([180,255,46])flag=cv2.inRange(hsv_img,lowerb=min,upperb=max)cv2.imshow("Image", img)cv2.imshow("flag", flag)cv2.waitKey (0)cv2.destroyAllWindows()

執行結果如下:

我們從執行後的結果中發現,我們需要捕獲的黑色,變成了白色顯示,其它顏色則變成了黑色。那我們接著將捕獲的黑色換成綠色。那麼我們更改低值與高值陣列,改成綠色的低值為 35、43、46,高值77、 255、 255:

min=np.array([35,43,46])max=np.array([77,255,255])

執行程式碼,結果如下:

這個時候綠色捕獲成功,其它顏色變成了黑色,或者說都為0。

2.3 使用inRange對影片中目標進行捕獲

在前兩篇文章中,我們已經瞭解瞭如何讀取影片裝置流,那如何讀取影片呢?其實流程是一樣的,我們首先建立VideoCapture,並且傳入影片路徑獲取影片物件。

capture=cv2.VideoCapture(r'C:\Users\mx\Desktop\hmbb.mp4')

隨後迴圈使用read方法讀取影片(類似方法不再進行贅述):

while True:    r,img=capture.read()    if r==False:        break

那麼接下來就開始等待與顯示了。我們每一幀影片都是一張圖片,那麼只要不斷的在一個視窗中顯示圖片就可以了,新增完顯示程式碼後,完整程式碼如下:

import cv2import numpy as npcapture=cv2.VideoCapture(r'C:\Users\mx\Desktop\hmbb.mp4')while True:    r,img=capture.read()    if r==False:        break    cv2.imshow("hmbb", img)    k=cv2.waitKey (40)    if k==27:        breakcv2.destroyAllWindows()

這個時候執行程式碼,成功的播放影片:

我在這裡使用的是海綿寶寶,我們接下來捕獲跟蹤影片中的海綿寶寶物件。海綿寶寶是一個類似於黃色的物體,那麼我們只需要建立兩個陣列用於捕捉黃色影象即可,其它程式碼跟圖片捕捉的程式碼一致,不再贅述,完整程式碼如下:

import cv2import numpy as npcapture=cv2.VideoCapture(r'C:\Users\mx\Desktop\hmbb.mp4')min=np.array([26,43,46])max=np.array([34,255,255])while True:    r,img=capture.read()    if r==False:        break    hsv_img=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)    flag=cv2.inRange(hsv_img,lowerb=min,upperb=max)    cv2.imshow("flag", flag)    cv2.imshow("hmbb", img)    k=cv2.waitKey (40)    if k==27:        breakcv2.destroyAllWindows()

執行結果如下:

當我們執行程式碼後,出現兩個視窗,有一個視窗將對影片進行捕獲內容,並且很好的捕獲到了影片中的海綿寶寶。

三、總結瞭解透過圖片轉換色彩空間HSV,從而對目標顏色從相片中進行捕獲瞭解常規顏色的取值範圍,並且瞭解了inRange方法的使用,傳入值範圍和圖片即可對目標顏色物體進行跟蹤

匯出

匯出為 Markdown檔案

匯出為 HTML檔案

28
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 動態代理原理——JDK(圖文並茂)