【OpenCv-Python】九、Changing Colorspaces顏色空間轉換

顏色空間轉換

目標

  • 在本教程中,您將學習如何將圖像從一個顏色空間轉換爲另一個顏色空間,如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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章