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,通過這種方式,我們可以就可以提取視訊或圖片中一個某個有顏色的物件。
例如下面的應用程式所示,我們將嘗試提取一個藍色的物件。方法如下:
- 取視訊的每一幀 。
- 轉換從BGR到HSV顏色空間 。
- 對HSV影象設定藍色範圍的閾值。
- 單獨提取藍色物件。
程式碼如下所示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庫的強大之處。