文章目錄
- 1. hsv色彩空間
- 2. 綜合程式
-
- 2.1 功能概述
- 2.2 代碼實作
- 2.3 代碼分析
- 2.4 程式示範
1. hsv色彩空間
- 色調H:用角度度量,取值範圍為0°~360°,從紅色開始按逆時針方向計算,紅色為0°,綠色為120°,藍色為240°。它們的補色是:黃色為60°,青色為180°,紫色為300°;
- 飽和度S:飽和度S表示顔色接近光譜色的程度。一種顔色,可以看成是某種光譜色與白色混合的結果。其中光譜色所占的比例愈大,顔色接近光譜色的程度就愈高,顔色的飽和度也就愈高。飽和度高,顔色則深而豔。光譜色的白光成分為0,飽和度達到最高。通常取值範圍為0%~100%,值越大,顔色越飽和;
- 明度V:明度表示顔色明亮的程度,對于光源色,明度值與發光體的光亮度有關;對于物體色,此值和物體的透射比或反射比有關。通常取值範圍為0%(黑)到100%(白)。
在HSV中比在BGR顔色空間中更容易表示顔色。可以通過設定HSV色彩空間的高低門檻值來提取出圖像中的特定區域。
2. 綜合程式
2.1 功能概述
該程式的輸入是一個視訊,視訊中有一些晃動的綠色小球,本程式實作基于hsv的色彩空間對視訊中的小球進行提取和追蹤。
2.2 代碼實作
import cv2 as cv
import numpy as np
# 追蹤程式
def test():
color = eval(input("請輸入追蹤的顔色bgr表示:"))
target_hsv = cv.cvtColor(np.uint8(color).reshape((1,1,3)),cv.COLOR_BGR2HSV)
print(f'target_hsv = {target_hsv}')
target_hsv = target_hsv.flatten()
BOUND = 20
lower_hsv = np.array([target_hsv[0]-BOUND,10,10])
higher_hsv = np.array([target_hsv[0]+BOUND,255,255])
print(f'lower_hsv={lower_hsv};higher_hsv={higher_hsv}')
cap = cv.VideoCapture("videos/green_ball.mp4")
while True:
# 讀取幀
ret, frame = cap.read()
if not ret:break
# 轉換顔色空間 BGR 到 HSV
hsv_img = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
# 設定HSV的門檻值使得隻取指定顔色
mask = cv.inRange(hsv_img, lower_hsv, higher_hsv)
# 将掩膜和圖像逐像素相加
res = cv.bitwise_and(frame,frame, mask= mask)
cv.imshow("mask",mask)
cv.imshow("frame",frame)
cv.imshow("res",res)
# 每5ms讀取一幀
if cv.waitKey(5) == 27:
break
cv.destroyAllWindows()
if __name__ == "__main__":
test()
2.3 代碼分析
- 使用者輸入要跟蹤物體顔色的 bgr 表示
注意是 BGR 值而不是 RGB值,通常可以通過截屏軟體得到某物體的RGB值,此時要将得到的數組的第一項和第三項的值換一下再作為程式的輸入。
- 程式将得到的BGR值轉換為hsv值
color = eval(input("請輸入追蹤的顔色bgr表示:")) target_hsv = cv.cvtColor(np.uint8(color).reshape((1,1,3)),cv.COLOR_BGR2HSV)
- 把[H- 10,40,40]和[H+ 10,255, 255]分别作為下界和上界。
target_hsv = target_hsv.flatten() BOUND = 10 lower_hsv = np.array([target_hsv[0]-BOUND,40,40]) higher_hsv = np.array([target_hsv[0]+BOUND,255,255])
- 讀入視訊流
-
每5ms讀入一幀圖像進行處理
(1)将該幀圖像由BGR空間轉換到HSV空間;
(2)根據HSV的門檻值使得隻取指定顔色;
(3)将掩膜和圖像逐像素相加;
while True: # 讀取幀 ret, frame = cap.read() if not ret:break # 轉換顔色空間 BGR 到 HSV hsv_img = cv.cvtColor(frame, cv.COLOR_BGR2HSV) # 根據HSV的門檻值使得隻取指定顔色 mask = cv.inRange(hsv_img, lower_hsv, higher_hsv) # 将掩膜和圖像逐像素相加 res = cv.bitwise_and(frame,frame, mask= mask) cv.imshow("mask",mask) cv.imshow("frame",frame) cv.imshow("res",res) # 每5ms讀取一幀 if cv.waitKey(5) == 27: break