HSV OpenCv 颜色范围

6
请问有没有人能告诉我一个网站或者任何地方,可以获取基本颜色如黄色、绿色、红色、蓝色、黑色、白色、橙色的HSV上下范围?
实际上,我正在制作一个机器人,它会先跟随黑色线路,然后在线路中间会有另一种颜色,从那里分成三条不同颜色的线路。机器人需要决定跟随哪一条线路。为此,我需要正确的hsv颜色范围。

色调在这里:https://de.m.wikipedia.org/wiki/HSV-Farbraum#/media/Datei%3AHueScale.svg 在OpenCV中,为了适应一个字节的范围,色调精度被减半,因此色调通道的范围仅为0到180。为了不使用白色或黑色,您应该为饱和度和亮度通道添加阈值。 - Micka
1个回答

2

灵感来自于answers.opencv link的回答。

根据这里的文档

HSV范围如下:H从0-179,S和V从0-255,因此对于您所需的下限和上限范围示例,您可以针对任何给定的[h,s,v]执行:

[h-10,s-40,v-40] 用于下限

[h+10,s+10,v+40] 用于上限,对于黄色,绿色,红色,蓝色,黑色,白色,橙色 RGB值。

示例中复制的代码:

import cv2
import numpy as np

image_hsv = None   # global ;(
pixel = (20,60,80) # some stupid default

# mouse callback function
def pick_color(event,x,y,flags,param):
    if event == cv2.EVENT_LBUTTONDOWN:
        pixel = image_hsv[y,x]

        #you might want to adjust the ranges(+-10, etc):
        upper =  np.array([pixel[0] + 10, pixel[1] + 10, pixel[2] + 40])
        lower =  np.array([pixel[0] - 10, pixel[1] - 10, pixel[2] - 40])
        print(pixel, lower, upper)

        image_mask = cv2.inRange(image_hsv,lower,upper)
        cv2.imshow("mask",image_mask)

def main():
    import sys
    global image_hsv, pixel # so we can use it in mouse callback

    image_src = cv2.imread(sys.argv[1])  # pick.py my.png
    if image_src is None:
        print ("the image read is None............")
        return
    cv2.imshow("bgr",image_src)

    ## NEW ##
    cv2.namedWindow('hsv')
    cv2.setMouseCallback('hsv', pick_color)

    # now click into the hsv img , and look at values:
    image_hsv = cv2.cvtColor(image_src,cv2.COLOR_BGR2HSV)
    cv2.imshow("hsv",image_hsv)

    cv2.waitKey(0)
    cv2.destroyAllWindows()

if __name__=='__main__':
    main()

上面的代码是用于从您正在捕获的图像或视频中直接选择HSV范围,方法是单击所需颜色。
如果您想预定义您的范围,您可以使用内置的Python库colorsys编写简单的代码片段,使用colorsys.rgb_to_hsv函数将RGB转换为HSV。
请注意,此函数仅接受0到1范围内的RGB值,并且还以0到1范围内的HSV值给出,因此要使用相同的值,您需要将其规范化为OpenCV。
代码片段:
import colorsys
'''
convert given rgb to hsv opencv format
'''

def rgb_hsv_converter(rgb):
    (r,g,b) = rgb_normalizer(rgb)
    hsv = colorsys.rgb_to_hsv(r,g,b)
    (h,s,v) = hsv_normalizer(hsv)
    upper_band = [h+10, s+40, v+40]
    lower_band = [h-10, s-40, v-40]
    return {
        'upper_band': upper_band,
        'lower_band': lower_band
    }

def rgb_normalizer(rgb):
    (r,g,b) = rgb
    return (r/255, g/255, b/255)

def hsv_normalizer(hsv):
    (h,s,v) = hsv
    return (h*360, s*255, v*255)

rgb_hsv_converter((255, 165, 0))

将返回:

{'upper_band': [48.82352941176471, 295.0, 295.0], 'lower_band': [28.82352941176471, 215.0, 215.0]}

这是您的橙色HSV带。


我不明白,能否请您详细解释一下? - Priyom saha
更新后的答案,附带更好的解释和示例 - warl0ck
谢谢 @warl0ck - Priyom saha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接