【opencv-python捕捉特定色彩&色彩追踪】

捕捉图片的特定色彩

这里有一张图片,我想要捕捉图片中的蓝色

【opencv-python捕捉特定色彩&色彩追踪】_第1张图片

第一步 ,首先把图片变成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)

【opencv-python捕捉特定色彩&色彩追踪】_第2张图片
第二步,创造一个追踪窗口,该窗口中添加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)

【opencv-python捕捉特定色彩&色彩追踪】_第3张图片
获取滑动条的值
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)

【opencv-python捕捉特定色彩&色彩追踪】_第4张图片

    imgResult = cv2.bitwise_and(img, img, mask=mask)

最终得到了筛选出来的蓝色,当然我们也可以根据此方法筛选出来其他颜色
【opencv-python捕捉特定色彩&色彩追踪】_第5张图片
比如灰色
【opencv-python捕捉特定色彩&色彩追踪】_第6张图片
比如红色
【opencv-python捕捉特定色彩&色彩追踪】_第7张图片
完整的代码

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)

你可能感兴趣的:(opencv,python,opencv,图像处理)