在HSV颜色空间中要比BGR空间中更容易表示一个特定的颜色。
在Opencv的HSV格式中,H(色彩/色度)的取值范围是[0,179],S(饱和度)的取值范围是[0,255],V(亮度)的取值范围是[0,255]。但是不同的软件使用的hsv的格式可能会不同(有的H的取值范围是0-360),要记得归一化处理
我们可以利用这一个特点来提取一个特定颜色的物体:
下面的程序提取的是一个蓝色的物体(我的手机):
import cv2
import numpy as np
cap = cv2.VideoCapture(0)
while True:
ret ,frame = cap.read()
cv2.namedWindow("frame", 0)
cv2.resizeWindow("frame", 500, 400)
cv2.namedWindow("mask", 0)
cv2.resizeWindow("mask", 500, 400)
cv2.namedWindow("res", 0)
cv2.resizeWindow("res", 500, 400)
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
lower_blue = np.array([0,35,139])
upper_blue = np.array([87,245,255])
mask = cv2.inRange(hsv,lower_blue,upper_blue)
res = cv2.bitwise_and(frame,frame,mask=mask)
cv2.imshow('frame',frame)
cv2.imshow('mask',mask)
cv2.imshow('res',res)
k = cv2.waitKey(5) & 0xFF
if k == 27:
break
cv2.destroyAllWindows()
好的那么问题来了,我是怎么知道这个蓝色的颜色的hsv的范围,大家可以借鉴一下这个程序(由于我对这个格式还是比较陌生,所以我从另外一片博客找到了这个代码,我修改了一下)
找到特定颜色的hsv
import cv2
import numpy as np
cap = cv2.VideoCapture(0)
# 滑动条的回调函数,获取滑动条位置处的值
def empty(a):
h_min = cv2.getTrackbarPos("Hue Min", "TrackBars")
h_max = cv2.getTrackbarPos("Hue Max", "TrackBars")
s_min = cv2.getTrackbarPos("Sat Min", "TrackBars")
s_max = cv2.getTrackbarPos("Sat Max", "TrackBars")
v_min = cv2.getTrackbarPos("Val Min", "TrackBars")
v_max = cv2.getTrackbarPos("Val Max", "TrackBars")
return h_min, h_max, s_min, s_max, v_min, v_max
# 创建一个窗口,放置6个滑动条
cv2.namedWindow("TrackBars")
cv2.resizeWindow("TrackBars", 640, 240)
cv2.createTrackbar("Hue Min", "TrackBars", 78, 125, empty)
cv2.createTrackbar("Hue Max", "TrackBars", 99, 155, empty)
cv2.createTrackbar("Sat Min", "TrackBars", 43, 43, empty)
cv2.createTrackbar("Sat Max", "TrackBars", 255, 255, empty)
cv2.createTrackbar("Val Min", "TrackBars", 46, 46, empty)
cv2.createTrackbar("Val Max", "TrackBars", 255, 255, empty)
while True:
ret ,img = cap.read()
imgHSV = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# 调用回调函数,获取滑动条的值
h_min, h_max, s_min, s_max, v_min, v_max = empty(0)
lower = np.array([h_min, s_min, v_min])
upper = np.array([h_max, s_max, v_max])
# 获得指定颜色范围内的掩码
mask = cv2.inRange(imgHSV, lower, upper)
# 对原图图像进行按位与的操作,掩码区域保留
imgResult = cv2.bitwise_and(img, img, mask=mask)
cv2.imshow("Mask", mask)
cv2.imshow("Result", imgResult)
cv2.waitKey(1)
从这个图片中找到颜色的大致范围,然后再滚轮中找到最符合的那个
如果要找特定颜色RGB值所对应的HSV的值,用下面的这个代码:
(注意是三个中括号)
import cv2
import numpy as np
green = np.uint8([[[0,255,0]]])
hsv_green = cv2.cvtColor(green, cv2.COLOR_BGR2HSV)
print(hsv_green)
#输出
[[[ 60 255 255]]]