Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用OpenCV查找红色区域?_Python_Opencv_Colors - Fatal编程技术网

Python 如何使用OpenCV查找红色区域?

Python 如何使用OpenCV查找红色区域?,python,opencv,colors,Python,Opencv,Colors,我正在尝试制作一个程序,在其中我检测到红色。然而,有时它比平常暗,所以我不能只使用一个值。 检测不同深浅红色的最佳范围是什么? 我目前使用的范围是128,0,0-255,60,60,但有时它甚至没有检测到我放在它前面的红色物体。您可以检查红色分量是否为最大值,其他分量是否明显较低: def red(r, g, b): threshold = max(r, g, b) return ( threshold > 8 # stay away fr

我正在尝试制作一个程序,在其中我检测到红色。然而,有时它比平常暗,所以我不能只使用一个值。 检测不同深浅红色的最佳范围是什么?
我目前使用的范围是128,0,0-255,60,60,但有时它甚至没有检测到我放在它前面的红色物体。

您可以检查红色分量是否为最大值,其他分量是否明显较低:

def red(r, g, b):
    threshold = max(r, g, b)
    return (
        threshold > 8          # stay away from black
        and r == threshold     # red is biggest component
        and g < threshold*0.5  # green is much smaller
        and b < threshold*0.5  # so is b
    )
def红色(r、g、b):
阈值=最大值(r、g、b)
返回(
阈值>8#远离黑色
r==阈值#红色是最大的成分
g
这可以使用numpy非常有效地实现

“正确的方法”是对HSV进行完全转换,并在那里进行检查,但速度会慢一些,而且会有点棘手(色调是一个角度,所以你不能只取差值的绝对值,而且像(255,254,254)这样的颜色将被限定为“红色”,即使它们被认为是人类的白色)

还要注意的是,人类的视觉系统往往会对平均值进行补偿,因此即使图像中最大的部分是红色,也可以将某些东西视为“蓝色”,但图像中的所有东西都是红色,因此对我们的大脑来说“不算”

在下图中,如果你问一个人圆圈区域中的部分是什么颜色,大多数人会说“蓝色”,而实际上最大的部分是红色:


请使用HSV或HSL(色调、饱和度、亮度)代替RGB,在HSV中,使用
色调的值可以在一定阈值内轻松检测红色。

RGB
不是用于特定颜色检测的良好颜色空间
HSV
将是一个不错的选择

对于红色,您可以使用以下颜色映射选择HSV范围
(0,50,20)~(5255255)
(175,50,20)~(180255255)
。当然,
红色范围
没有那么精确,但它还可以

代码取自我的另一个答案:

有关答案:

  • 当然,对于具体的问题,也许其他颜色空间也可以


    红色表示红色值高于蓝色和绿色

    因此,您可以检查红色和蓝色、红色和绿色之间的差异

    您可以简单地将RGB分割成单独的通道,然后像这样应用阈值

    b,g,r = cv2.split(img_rgb)
    rg = r - g
    rb = r - b
    rg = np.clip(rg, 0, 255)
    rb = np.clip(rb, 0, 255)
    
    mask1 = cv2.inRange(rg, 50, 255)
    mask2 = cv2.inRange(rb, 50, 255)
    mask = cv2.bitwise_and(mask1, mask2)
    
    希望它能解决你的问题


    谢谢。

    只检查
    色调是行不通的,除非你认为(255254254)是一个完美的“红色”。@6502它比绿色或其他颜色更红。此外,OP在颜色较深方面也存在问题。为什么将BGR转换为HSV会改变颜色?为什么它似乎与基于原始图像的HSV值相匹配?这与opencv的答案类似。他们还建议使用opencv从RGB转换为HSV,并使用色调+/-10和[50255]范围来表示饱和度和似乎的值。为什么所有其他颜色选择器都使用范围为[0360]的度值使用[0180]标量时的色调?对于那些浏览答案的人来说,有一点细微差别就是所有的颜色选择器都使用(百分比)值[01100]%作为饱和度和颜色值。
    
    b,g,r = cv2.split(img_rgb)
    rg = r - g
    rb = r - b
    rg = np.clip(rg, 0, 255)
    rb = np.clip(rb, 0, 255)
    
    mask1 = cv2.inRange(rg, 50, 255)
    mask2 = cv2.inRange(rb, 50, 255)
    mask = cv2.bitwise_and(mask1, mask2)