OpenCV中汇集了150多种颜色颜色空间的转变方法,接下来只看最常用的两种,即BGR <--->Gray 和 BGR <--> HSV
import cv2
# color-space转变函数
cv2.cvtColor(input_image, flag)
# 查看颜色空间flag
flags = [i for i in dir(cv2) if i.startswith('COLOR_')]
print flags
'''
note:
对于HSV,Hue(色调)范围为[0,180],Saturation(饱和度)范围是[0,255],Value范围是[0,255]
不同的图像处理软件下具有不同的范围,
如果想将其他如PS中的图像(Hue范围是[0,360])与OpenCV下处理图像作比较时,要做一下归一化
'''
HSV color-space相比RGB color-space更容易表示一个颜色,以下应用中,将提取一个黑色(外框)和一个绿色(内框)的对象。
(1).获取视频每一帧
(2)每一帧从BGR转换颜色空间到HSV
(3)阈值化HSV图像,将其分别阈值化在一个绿色和黑色的范围内
(4)分别提取出黑色目标和蓝色目标,叠加mask合成
Code:
import cv2
import numpy as np
cap = cv2.VideoCapture('../video/VID_20190710_165704.mp4')
ret, fm_0 = cap.read()
c = 1
timeF = 5
# 黑色HSV范围
hsv_black = np.uint8([[[0,0,0],[255,180,46]]])
# 绿色BGR范围
gbr_green = np.uint8([[[13,94,64],[40,114,84]]])
# 绿色HSV范围,将绿色BGR转换到HSV
hsv_green = cv2.cvtColor(gbr_green,cv2.COLOR_BGR2HSV)
while ret:
ret, fm = cap.read()
if ret is True:
hsv_fm = cv2.cvtColor(fm,cv2.COLOR_BGR2HSV)
# 范围阈值化
mask_black = cv2.inRange(hsv_fm,hsv_black[0,0],hsv_black[0,1])
mask_green = cv2.inRange(hsv_fm, hsv_green[0, 0], hsv_green[0, 1])
# 合成
mask = cv2.addWeighted(mask_black,0.5,mask_green,0.5,1)
# 只提取蓝色和黑色前景
res = cv2.bitwise_and(fm,fm,mask=mask)
if c % timeF == 0:
cv2.namedWindow('res',cv2.WINDOW_NORMAL)
cv2.imshow('res',res)
cv2.namedWindow('mask', cv2.WINDOW_NORMAL)
cv2.imshow('mask',mask)
c = c+1
k = cv2.waitKey(10) & 0xff
if k == 27:
cv2.destroyAllWindows()
cap.release()
# 注:此图像没考虑去噪过程,随后可将去噪添加进来
结果图:
HSV颜色体系表: