一、學習目標
- 了解為什么色彩空間的轉換那么重要
- 了解opencv中進行對象跟蹤的方法
目錄
[python opencv 計算機視覺零基礎到實戰] 一、opencv的helloworld
[【python opencv 計算機視覺零基礎到實戰】二、 opencv文件格式與攝像頭讀取] 一、opencv的helloworld
[[python opencv 計算機視覺零基礎到實戰] 三、numpy與圖像編輯] 一、opencv的helloworld
[[python opencv 計算機視覺零基礎到實戰] 四、了解色彩空間及其詳解] 一、opencv的helloworld
[[python opencv 計算機視覺零基礎到實戰] 五、對象追蹤] 一、opencv的helloworld
如有錯誤歡迎指出~
二、了解OpenCV中使用inRange進行對象跟蹤
2.1 了解色彩空間的轉換為什么那么重要
上一節中,我們了解了色彩空間的轉換,那為什么要了解色彩空間?上一節中并沒有進行說明,這一節將通過色彩空間的轉換,使我們能夠對一些對象進行追蹤;這一節所需要轉換的色彩空間是HSV色彩空間,在HSV色彩空間中,不同的顏色有不同的取值范圍,通過這些范圍可以對一些指定顏色進行過濾捕獲,從而實現跟蹤。
首先我們查看一下HSV色彩空間中,一般顏色的取值范圍。HSV存在3個通道,我們以下為黑白灰、紅橙黃綠青藍紫顏色的三個通道取值范圍;我們了解了取值范圍后將有利于我們對這些顏色的取值:
黑:
- H低值為 0,S低值為 0,V低值為 0
- H高值為 180,S高值為 255,V高值為 46
白:
- H低值為 0,S低值為 0,V低值為 221
- H高值為 180,S高值為 30,V高值為 255
灰:
- H低值為 0,S低值為 0,V低值為 46
- H高值為 180,S高值為 43,V高值為 220
紅:
- H低值為 156,S低值為 43,V低值為 46
- H高值為 180,S高值為 255,V高值為 255
橙:
- H低值為 11,S低值為 43,V低值為 46
- H高值為 25,S高值為 255,V高值為 255
黃:
- H低值為 26,S低值為 43,V低值為 46
- H高值為 34,S高值為 255,V高值為 255
綠:
- H低值為 35,S低值為 43,V低值為 46
- H高值為 77,S高值為 255,V高值為 255
青:
- H低值為 78,S低值為 43,V低值為 46
- H高值為 99,S高值為 255,V高值為 255
藍:
- H低值為 100,S低值為 43,V低值為 46
- H高值為 124,S高值為 255,V高值為 255
紫:
- H低值為 125,S低值為 43,V低值為 46
- H高值為 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 cv2
import 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 cv2
import 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 cv2
import numpy as npcapture=cv2.VideoCapture(r'C:\Users\mx\Desktop\hmbb.mp4')while True:r,img=capture.read()if r==False:breakcv2.imshow("hmbb", img)k=cv2.waitKey (40)if k==27:break
cv2.destroyAllWindows()
這個時候運行代碼,成功的播放視頻:
我在這里使用的是海綿寶寶,我們接下來捕獲跟蹤視頻中的海綿寶寶對象。海綿寶寶是一個類似于黃色的物體,那么我們只需要創建兩個數組用于捕捉黃色圖像即可,其它代碼跟圖片捕捉的代碼一致,不再贅述,完整代碼如下:
import cv2
import 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:breakhsv_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:break
cv2.destroyAllWindows()
運行結果如下:
當我們運行代碼后,出現兩個窗口,有一個窗口將對視頻進行捕獲內容,并且很好的捕獲到了視頻中的海綿寶寶。
該系列文章首發于易百納。
三、總結
- 了解通過圖片轉換色彩空間HSV,從而對目標顏色從相片中進行捕獲
- 了解常規顏色的取值范圍,并且了解了inRange方法的使用,傳入值范圍和圖片即可對目標顏色物體進行跟蹤