滑稽研究所0ac9c3de72f0eb892050105fadd03618.gif

在HSV色彩空间下检测颜色

哈喽,大家好呀,我是滑稽君。还记得上一期我们提到的颜色检测的方法吗?本期我们就来详细的聊一聊如何利用opencv进行颜色检测。

25f52e863ac9eb4600e8831073441044.gif

视频讲解:

下图为HSV的色调盘。

bf1bf2952de80b9346a063a62fb5dca9.png

我们知道H代表色调,S代表饱和度,V代表明度。那么当我们选取一个主色调如黄色,则S和V对应的关系如下图。

3e02b665505a10c936f98ed256c14754.png

可以理解为在Hue一定的情况下,饱和度减小,就是往光谱色中添加白色,光谱色所占的比例也在减小,饱和度减为0,表示光谱色所占的比例为零,导致整个颜色呈现白色。明度减小,就是往光谱色中添加黑色,光谱色所占的比例也在减小,明度减为0,表示光谱色所占的比例为零,导致整个颜色呈现黑色。

我们在opencv里处理时,需要先把图像转换成HSV格式。之后用到createTrackbar()和getTrackbarPos()方法。前者在窗口中生成滑块,这样我们可以实时的控制值的大小方便记录,后者用来接收对应滑块返回的值,注意这只完成了对滑块值的实时检测,我们还需要把返回的值交给inRange()让它为我们保留范围内的色彩。下面我们上代码。

源代码:

import cv2import numpy as npframeWidth = 340frameHeight = 280cap = cv2.VideoCapture(1)cap.set(3, frameWidth)cap.set(4, frameHeight)cap.set(10,150)#设置回调函数,这里不需要所以passdef empty(a):    passcv2.namedWindow("HSV")cv2.resizeWindow("HSV",640,240)cv2.createTrackbar("HUE Min","HSV",0,179,empty)cv2.createTrackbar("SAT Min","HSV",0,255,empty)cv2.createTrackbar("VALUE Min","HSV",0,255,empty)cv2.createTrackbar("HUE Max","HSV",179,179,empty)cv2.createTrackbar("SAT Max","HSV",255,255,empty)cv2.createTrackbar("VALUE Max","HSV",255,255,empty)while True:    _, img = cap.read()    imgHsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)    h_min = cv2.getTrackbarPos("HUE Min","HSV")    h_max = cv2.getTrackbarPos("HUE Max", "HSV")    s_min = cv2.getTrackbarPos("SAT Min", "HSV")    s_max = cv2.getTrackbarPos("SAT Max", "HSV")    v_min = cv2.getTrackbarPos("VALUE Min", "HSV")    v_max = cv2.getTrackbarPos("VALUE Max", "HSV")    lower = np.array([h_min,s_min,v_min])    upper = np.array([h_max,s_max,v_max])    mask = cv2.inRange(imgHsv,lower,upper)    result = cv2.bitwise_and(img,img, mask = mask)    mask = cv2.cvtColor(mask, cv2.COLOR_GRAY2BGR)    #3个结果并排放在一起。    hStack = np.hstack([img,mask,result])    cv2.imshow('Horizontal Stacking', hStack)    if cv2.waitKey(1) & 0xFF == ord('q'):        breakcap.release()cv2.destroyAllWindows()

生成的滑块条:

e0d5fbb76ab1d32692fd9be708405b51.png

检测窗口:

检测红色的笔

07e746699072f2350992dffe31bd1c1f.png

依次为img(原图),mask和大家熟悉的与运算(and)结果。

红色对应的值应为:

5468e8df7719de97dd9a4b5da78a5546.png

我将在视频中为大家演示如何快速的捕捉到自己想要的颜色。

同样的方法把值放入上期代码可得到如下结果。

1471daddfb6b45ae183fef727cc29360.png

如下,色彩值部分,与笔尖颜色设置应一一对应。否则将返回错误的颜色。

#上期代码中色彩值部分myColors = [[77,149,137,83,255,255],            [168,133,190,179,255,255],            [91,157,140,102,255,255]]#笔触颜色myColorValues = [[0,255,0],                [0,0,255],                 [255,0,0]]

我将在视频中为大家展示如何快速的捕捉到我们想要的颜色。

本期素材来自国外的《Learn-OpenCV-in-3-hours-master》教学视频。

bfd314ed2cf604776151be860b909be3.gif❂ END

 上期传送门:opencv通过摄像头捕捉指定物体

7c08ff8e86915e0a4cf5cdf3b92468c2.png
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐