二、瞭解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檔案