⚠️這個系列是自己瞎翻的,文法很醜,主要靠意會,跳着跳着撿重要的部分翻,翻錯了不負責,就這樣哈。
⚠️基於3.4.3,Changing Colorspaces,附原文。
目標
- 在這個教程中,你會學到如何把圖像從一個色彩空間改變到另外一個。比如BGR ↔ Gray,BGR ↔ HSV等等。
- 除此之外,我們還將創建一個提取視頻中彩色對象的應用程序。
- 你會學到以下這些方法:cv.cvtColor(),cv.inRange() 等等。
改變顏色空間
這大概有150多種可用的顏色空間轉換的方法,在OpenCV裏。但咱們着眼於兩個應用最廣泛的:BGR ↔ Gray 以及 BGR ↔ HSV。
要改變顏色,我們使用方法 cv.cvtColor(input_image, flag) 參數flag決定圖像轉換的類型。
要從BGR轉成Gray我們用這個標誌 cv.COLOR_BGR2GRAY。類似的,BGR轉成HSV,我們用 cv.COLOR_BGR2HSV 這個標誌。要知道其他的標誌,只要運行以下命令,在你Python的終端上:
>>> import cv2 as cv
>>> flags = [i for i in dir(cv) if i.startswith('COLOR_')]
>>> print( flags )
提示
對HSV來說,色調範圍是 [0,179] ,飽和度範圍是 [0,255] 數值範圍是 [0,255] 。不同的軟件使用了不同的標尺,所以,如果你要比較OpenCV中的數值和其他軟件給出的數值,你就需要把他們標準化。
對象跟蹤
現在我們知道如何把 BGR 圖像轉成 HSV,我們可以使用這招來提取彩色對象。在 HSV 裏,展示出一種顏色比在 BGR 色彩空間裏更容易。在我們的應用裏,我們嘗試提取出藍色的物體,方法如下:
- 拿到視頻中的每一幀。
- 把色彩空間從 BGR 改到 HSV。
- 我們把藍色的範圍設置爲 HSV 圖像的閾值。
- 現在只提取藍色的對象,我們可以對這圖像做任何我們想做的事情。
以下代碼有詳細的註釋:
import cv2 as cv
import numpy as np
cap = cv.VideoCapture(0)
while(1):
# Take each frame
_, frame = cap.read()
# Convert BGR to HSV
hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
# define range of blue color in HSV
lower_blue = np.array([110,50,50])
upper_blue = np.array([130,255,255])
# Threshold the HSV image to get only blue colors
mask = cv.inRange(hsv, lower_blue, upper_blue)
# Bitwise-AND mask and original image
res = cv.bitwise_and(frame,frame, mask= mask)
cv.imshow('frame',frame)
cv.imshow('mask',mask)
cv.imshow('res',res)
k = cv.waitKey(5) & 0xFF
if k == 27:
break
cv.destroyAllWindows()
以下圖像顯示了藍色物體的追蹤過程:
提示
圖像中有些噪聲,我們會在下節看看怎麼消除他們。(譯者注:瞭解一下圖像噪聲)
這是最最簡單的追蹤物體的方式,一旦你學會了關於輪廓的方法,你可以做很多事情,比如找物體質心來追蹤物體,對着攝像頭移動手指繪製圖表,以及很多其他好玩的事情。
如何找到HSV數值來追蹤呢
這是一個在 stackoverflow.com 這個網站上常見的問題。其實很簡單,你可以用同一個方法,cv.cvtColor() 。不是傳入一個圖像對象,而是傳入你想要的 BGR 值,比如,要找到綠色的 HSV 值。嘗試以下的命令在你的Python終端上:
>>> green = np.uint8([[[0,255,0 ]]])
>>> hsv_green = cv.cvtColor(green,cv.COLOR_BGR2HSV)
>>> print( hsv_green )
[[[ 60 255 255]]]
現在分別將 [H-10,100,100] 和 [H + 10,255,255] 作爲下限和上限。 除了這種方法,你可以使用任何圖像編輯工具,如GIMP或任何在線轉換器來查找這些值,但不要忘記調整HSV範圍。
額外資源
練習
- 嘗試找到一個方法來提取更多的彩色物體,比如同時提取紅色、藍色、綠色的物體。