顏色空間轉換
目標
- 在本教程中,您將學習如何將圖像從一個顏色空間轉換爲另一個顏色空間,如BGR——>Gray,BGR——>HSV 等。
- 除此之外,我們還將創建一個應用程序,在視頻中提取一個有色對象。
- 你將要學習這些函數:cv2.cvtColor(),cv2.inRange()等
9.1 轉換顏色空間
在OpenCV中有150多種顏色空間轉換方法。但是我們將只研究其中最廣泛使用的兩種,BGR 與 Gray,BGR 與 HSV。
對於顏色轉換,我們經常使用函數cv2.cvtColor(input_image, flag),其中 flag 決定轉換的類型。
對於BGR 與 Gray 轉換,我們使用flag 是 cv2.COLOR_BGR2GRAY。類似地,對於BGR 與 HSV,我們使用了flag 是 cv2.COLOR_BGR2HSV。要獲取其他flag,只需在Python終端中運行以下命令:
import cv2
flags = [i for i in dir(cv2) if i.startswith('COLOR_')]
print(flags)
注意
在 OpenCV 的 HSV 格式中 H(色彩/色度)的取值範圍是 [0,179] S(飽和度)的取值範圍 [0,255] V(亮度)的取值範圍 [0,255]。但是不同的軟件使用的值可能不同。所以當你需要拿 OpenCV 的 HSV 值與其他軟件的 HSV 值對比時,一定記得歸一化。
9.2 物體跟蹤
現在我們知道了如何將BGR圖像轉換爲HSV,我們可以用它來提取一個顏色對象。在HSV中,表示顏色比RGB顏色空間更容易。在我們的應用程序中,我們將嘗試提取一個藍色的對象。下面這就是方法:
- 提取每一幀的視頻
- 將圖像轉換到HSV空間
- 設置HSV圖像閾值到藍色範圍
- 現在提取藍色物體,我們可以在圖像上做任何我們想做的事情。
下面是有詳細註釋的代碼:
import cv2
import numpy as np
cap = cv2.VideoCapture(0)
while(1):
# 提取每一幀的視頻
_, frame = cap.read()
# 將BGR轉換爲 HSV
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
# 定義HSV中藍色的範圍
#黑色lower_black = np.array([0,0,0]) upper_black = np.array([180,255,46])
lower_blue = np.array([110,50,50])
upper_blue = np.array([130,255,255])
# 根據閾值HSV 構建掩模
mask = cv2.inRange(hsv, lower_blue, upper_blue)
# 對原圖像和掩模進行位運算
res = cv2.bitwise_and(frame,frame, mask= mask)
cv2.imshow('frame',frame)
cv2.imshow('mask',mask)
cv2.imshow('res',res)
k = cv2.waitKey(5) & 0xFF
if k == 27:
break
cv2.destroyAllWindows()
注意:
圖像中有一些噪聲。我們將在後面的章節中看到如何刪除它們。這是對象跟蹤中最簡單的方法。一旦你學習了等高線的功能,你可以做很多事情,比如找到這個物體的質心,然後用它來跟蹤物體,畫出圖,你的手在鏡頭前移動,還有很多其他有趣的東西。
9.3 如何找到要跟蹤對象的HSV值?
這是stackoverflow.com上常見的一個問題。它非常簡單,您可以使用相同的函數cv2.cvtColor()。您只需傳遞您想要的BGR值,而不是傳遞一個圖像。例如,要找到綠色的HSV值,可以在Python終端中嘗試以下命令:
green = np.uint8([[[0,255,0 ]]])
hsv_green = cv2.cvtColor(green,cv2.COLOR_BGR2HSV)
print(hsv_green)