opencv 实现颜色空间转换 特定颜色物体追踪
颜色空间转换
HSV简介
HSV是一个常用于颜色识别的模型,相比BGR更易区分颜色。H表示色调(Hue),S表示饱和度(Saturation),V表示明度(Value)。
OpenCV中色调H范围为[0,179],饱和度S是[0,255],明度V是[0,255]。虽然H的理论数值是0°~360°,但8位图像像素点的最大值是255,所以OpenCV中除以了2,某些软件可能使用不同的尺度表示,所以同其他软件混用时,记得归一化。
opencv中颜色空间转换
cv.cvtColor()用来进行颜色模型转换,参数1是要转换的图片,参数2是转换模式。
BGR -> Gray
cv.cvtColor(img, cv.COLOR_BGR2GRAY)
BGR -> HSV
cv.cvtColor(img, cv.COLOR_BGR2HSV)
其它情况请举一反三
颜色转换本质
颜色转换其实是数学运算,如灰度化最常用的是:
gray = R * 0.299 + G * 0.587 + B * 0.114
视频中特定颜色物体追踪
HSV是一个常用于颜色识别的模型,相比BGR更易区分颜色,转换模式用COLOR_BGR2HSV表示。
算法流程
- 捕获视频中的一帧
- 从BGR转换到HSV
- 提取蓝色范围的物体
- 只显示蓝色物体
代码实现
import cv2 as cv
import numpy as np
capture = cv.VideoCapture(0)
# 蓝色的范围,不同光照条件下不一样,可灵活调整
lower_blue = np.array([100, 110, 110])
upper_blue = np.array([130, 255, 255])
while(True):
# 1.捕获视频中的一帧
ret, frame = capture.read()
# 2.从BGR转换到HSV
hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
# 3.inRange():介于lower/upper之间的为白色,其余黑色
mask = cv.inRange(hsv, lower_blue, upper_blue)
# 4.只保留原图中的蓝色部分
res = cv.bitwise_and(frame, frame, mask=mask)
cv.imshow('frame', frame)
cv.imshow('mask', mask)
cv.imshow('res', res)
if cv.waitKey(1) == ord('q'):
break
实验结果(res)
如何得到蓝色的HSV的上下限lower和upper范围
blue = np.uint8([[[255, 0, 0]]])
hsv_blue = cv2.cvtColor(blue, cv2.COLOR_BGR2HSV)
print(hsv_blue) # [[[120 255 255]]]