第一步 ,首先把图片变成HSV图片这样方便我们找到颜色,RGB通道并不能很好地反映出物体具体的颜色信息 , 而相对于RGB空间,HSV空间能够非常直观的表达色彩的明暗,色调,以及鲜艳程度,方便进行颜色之间的对比
色调(H),饱和度(S),明度(V)
img = cv2.imread("Resources/majiang.JPG")
#这张图片有点大,给他缩小一下
img = cv2.resize(img, (0, 0), None, 0.4, 0.4)
# 色调(H),饱和度(S),明度(V)。
imgHSV = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
cv2.imshow("img", img)
cv2.imshow("imgHSV", imgHSV)
cv2.waitKey(0)
第二步,创造一个追踪窗口,该窗口中添加HSV三个值的滑动条,我们通过滑动条调整来捕捉蓝色的范围大小
cv2.createTrackbar()
第一个参数:滑动条的名字
第二个参数:滑动条被放置的窗口名字
第三个参数:滑动条的默认位置
第四个参数:滑动条的最大值
第五个参数:回调函数,每次滑动条的滑动都会调用该函数,该函数通常会有一个参数,这个参数就是滑动条的位置。
def empty(a):
pass
cv2.namedWindow("TrackBars")
cv2.resizeWindow("TrackBars",640,240)
cv2.createTrackbar("Hue Min","TrackBars",0,179,empty)
cv2.createTrackbar("Hue Max","TrackBars",179,179,empty)
cv2.createTrackbar("Sat Min","TrackBars",0,255,empty)
cv2.createTrackbar("Sat Max","TrackBars",240,255,empty)
cv2.createTrackbar("Val Min","TrackBars",153,255,empty)
cv2.createTrackbar("Val Max","TrackBars",255,255,empty)
获取滑动条的值
cv2.getTrackbarPos()
第一个参数是滑动条名字,
第二个时所在窗口,
返回值是滑动条的数值。
# 第一个参数是滑动条名字,
# 第二个时所在窗口,
# 返回值是滑动条的数值。
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")
print(h_min,h_max,s_min,s_max,v_min,v_max)
第三步,把滑动条的值和图片连接起来
cv2.inRange()
第一个参数:hsv指的是原图
第二个参数:lower_red指的是图像中低于这个lower_red的值,图像值变为0
第三个参数:upper_red指的是图像中高于这个upper_red的值,图像值变为0
而在lower_red~upper_red之间的值变成255
对滑动条调整一番后得到了hsv的数值 96 110 94 241 23 255 这就是该图片蓝色的数值
lower = np.array([h_min,s_min,v_min])
upper = np.array([h_max,s_max,v_max])
mask = cv2.inRange(imgHSV,lower,upper)
cv2.imshow("mask",mask)
imgResult = cv2.bitwise_and(img, img, mask=mask)
最终得到了筛选出来的蓝色,当然我们也可以根据此方法筛选出来其他颜色
比如灰色
比如红色
完整的代码
def empty(a):
pass
cv2.namedWindow("TrackBars")
cv2.resizeWindow("TrackBars",640,240)
cv2.createTrackbar("Hue Min","TrackBars",96,179,empty)
cv2.createTrackbar("Hue Max","TrackBars",110,179,empty)
cv2.createTrackbar("Sat Min","TrackBars",94,255,empty)
cv2.createTrackbar("Sat Max","TrackBars",241,255,empty)
cv2.createTrackbar("Val Min","TrackBars",23,255,empty)
cv2.createTrackbar("Val Max","TrackBars",255,255,empty)
while True:
img = cv2.imread("Resources/majiang.JPG")
img = cv2.resize(img, (0, 0), None, 0.4, 0.4)
# 色调(H),饱和度(S),明度(V)。
imgHSV = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
# 第一个参数是滑动条名字,
# 第二个时所在窗口,
# 返回值是滑动条的数值。
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")
print(h_min,h_max,s_min,s_max,v_min,v_max)
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("img", img)
cv2.imshow("imgHSV", imgHSV)
cv2.imshow("mask",mask)
cv2.imshow("imgResult", imgResult)
cv2.waitKey(1)