0.序言

之前的部落格裡我們介紹了opencv在影象上的基本操作,下面我們來進行稍微深入一點的介紹,從這裡開始我們可以發現opencv庫能給我們帶來的更多更有趣的功能。從現在開始,我們將逐步深入瞭解opencv庫中對影象處理的一些高階方式。

  • 在這篇部落格中,我們將學習如何將影象在色彩空間之間的轉換,例如BGR轉換成灰色,BGR轉換成HSV等
  • 此外,我們還將建立一個應用程式,以提取視訊中的彩色物件
  • 我們還將學習以下功能:cv.cvtColor,**cv.inRange**等

1.改變顏色空間

OpenCV中有超過150種顏色空間轉換的方法。但是我們只有兩個最廣泛使用的,BGR灰色和BGRHSV。

對於顏色轉換,我們使用cv函式。

cvtColor(input_image, flag)

其中flag決定轉換的型別。

例如對於BGR→灰度轉換,我們讓flag標記為cv.COLOR_BGR2GRAY。類似地,對於BGR→HSV,我們讓flag標記為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]。且不同的軟體裡使用不同的規模,這點細節需要注意。

2.物件追蹤

因為在HSV空間中比在BGR顏色空間中更容易表示顏色。現在我們知道了如何將BGR影象轉換成HSV,通過這種方式,我們可以就可以提取視訊或圖片中一個某個有顏色的物件。

例如下面的應用程式所示,我們將嘗試提取一個藍色的物件。方法如下:

  1. 取視訊的每一幀 。
  2. 轉換從BGR到HSV顏色空間 。
  3. 對HSV影象設定藍色範圍的閾值。
  4. 單獨提取藍色物件。

程式碼如下所示import cv2 as cv

import numpy as np
cap = cv.VideoCapture(0)
while(1):
# 讀取幀
_, frame = cap.read()
# 轉換顏色空間 BGR 到 HSV
hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
# 定義HSV中藍色的範圍
lower_blue = np.array([110,50,50])
upper_blue = np.array([130,255,255])
# 設定HSV的閾值使得只取藍色
mask = cv.inRange(hsv, lower_blue, upper_blue)
# 將掩膜和影象逐畫素相加
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()

  

效果就如圖所示:

注意:影象中有一些噪點。我們將在後面的章節中看到如何刪除它們。 這是物件跟蹤中最簡單的方法。一旦學習了輪廓的功能,我們就可以做很多事情,例如找到該物件的質心並使用它來跟蹤物件等,這也是opencv庫的強大之處。