【问题标题】:detect yellow color in opencv在opencv中检测黄色
【发布时间】:2012-02-29 01:17:52
【问题描述】:

在我将阈值设置为黄色之后,我将图像转换为 HSV,因此代码为 cvInRangeS(imgHSV, cvScalar(112, 100, 100), cvScalar(124, 255, 255), imgThreshed); 但它并不总是给我黑色图像。

【问题讨论】:

    标签: c++ c image-processing computer-vision


    【解决方案1】:

    你应该试试这个"tracking yellow objects".的教程

    它为黄色对象提供 cvInRangeS(imgHSV, cvScalar(20, 100, 100), cvScalar(30, 255, 255), imgThreshed) 的 HSV 范围。

    如果你对选择颜色有任何疑问,试试这个:http://www.yafla.com/yaflaColor/ColorRGBHSL.aspx

    【讨论】:

    • 但是如果我们有一个条件,比如我们有青色 23 和绿色黄色的值,比如 40 、 69 ,而不是你提到的网站如何找到他们的 HSV
    • 您需要 RGB 或 HSV 或 CMYK 或任何标准颜色空间的颜色值。然后您可以将它们转换为其他颜色空间。只需谷歌搜索转换公式(或任何为您进行转换的网站)。通常,青色、品红色和黄色是一起计算的。从来没有听说过青色、绿色和黄色的说法。
    • 你可以在这里看到,我正在尝试这样做,我必须处理所有这些,或者我可能解释错误,http://stackoverflow.com/questions/23312898/trying-to-make-color-balance-of-photoshop-using-opencv?noredirect=1#comment35693629_23312898这是我的情况
    【解决方案2】:

    我知道你问的问题是关于 c++ 的,我有 python 脚本来检测黄色,这可能会对你或其他人有所帮助..

    def colorDetection(image):
        hsv = cv2.cvtColor(image,cv2.COLOR_BGR2HSV)
    
        '''Red'''
        # Range for lower red
        red_lower = np.array([0,120,70])
        red_upper = np.array([10,255,255])
        mask_red1 = cv2.inRange(hsv, red_lower, red_upper)
    
        # Range for upper range
        red_lower = np.array([170,120,70])
        red_upper = np.array([180,255,255])
        mask_red2 = cv2.inRange(hsv, red_lower, red_upper)
    
        mask_red = mask_red1 + mask_red2
    
        red_output = cv2.bitwise_and(image, image, mask=mask_red)
    
        red_ratio=(cv2.countNonZero(mask_red))/(image.size/3)
    
        print("Red in image", np.round(red_ratio*100, 2))
    
    
    
        '''yellow'''
        # Range for upper range
        yellow_lower = np.array([20, 100, 100])
        yellow_upper = np.array([30, 255, 255])
        mask_yellow = cv2.inRange(hsv, yellow_lower, yellow_upper)
    
        yellow_output = cv2.bitwise_and(image, image, mask=mask_yellow)
    
        yellow_ratio =(cv2.countNonZero(mask_yellow))/(image.size/3)
    
        print("Yellow in image", np.round(yellow_ratio*100, 2))
    

    【讨论】:

    • red_ratio=(cv2.countNonZero(mask_red))/(image.size/3) 为什么这里要除以3??
    【解决方案3】:

    您还可以将 RGB 转换为 HUE

    http://en.wikipedia.org/wiki/Hue

    在你有公式的链接中,你知道黄色的 HUE 值在 60​​ 左右。

    【讨论】:

    • 在 OpenCV HUE 值在 0-180 之间,所以 30 左右的值是可以的。
    【解决方案4】:

    对于黄色,范围应该是 23 到 40,例如我在黄色对象跟踪程序中使用的范围

    //为黄色设置阈值

       cvInRangeS(hsvframe,cvScalar(23,41,133),cvScalar(40,150,255),threshy);
    

    【讨论】:

      【解决方案5】:

      我认为您的色调值可能不正确。如果您尝试检测黄色,我不确定您从哪里获得 112-124 色调范围。我希望这些值更接近 40,所以不妨试试 34-46 之类的范围。

      【讨论】:

      • 是的,谢谢你,你能写出每种颜色的范围吗(红色,绿色,蓝色)好吗? ???
      • RGB 空间的问题在于“颜色”对于我们认为的恒定颜色没有那么简单的解释。我建议您运行诸如 Paint 之类的工具并选择您认为适合您的任务的低和高 RGB 范围,如果您想在 RGB 图像而不是 HSV 图像上运行,请使用这些值。您可以从 (255,255,0) 之类的值开始,如果您正在寻找黄色,请查看它的位置。另请注意,OpenCV 以 BGR 顺序存储内容,因此 (0,255,255) 可能代表您插入到 inRange() 的范围。
      • cvInRangeS(imgHSV, cvScalar(0, 0, 60), cvScalar(0, 0, 255), imgThreshed);它没有检测到红色!可能是范围不正确,你能给我举个关于另一种颜色的例子,让我知道如何为其他颜色得出正确的范围
      猜你喜欢
      • 2014-03-15
      • 2019-09-17
      • 1970-01-01
      • 1970-01-01
      • 2015-10-13
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多