代码之家  ›  专栏  ›  技术社区  ›  dnul

检测白色的最佳方法是什么?[闭门]

  •  5
  • dnul  · 技术社区  · 14 年前

    我试图检测视频中的白色物体。第一步是过滤图像,使其只留下白色像素。我的第一个方法是使用HSV颜色空间,然后检查高水平的VAL通道。以下是代码:

    //convert image to hsv
    cvCvtColor( src, hsv, CV_BGR2HSV );
    cvCvtPixToPlane( hsv, h_plane, s_plane, v_plane, 0 );
    
    for(int x=0;x<srcSize.width;x++){
      for(int y=0;y<srcSize.height;y++){
        uchar * hue=&((uchar*) (h_plane->imageData+h_plane->widthStep*y))[x];
        uchar * sat=&((uchar*) (s_plane->imageData+s_plane->widthStep*y))[x];
        uchar * val=&((uchar*) (v_plane->imageData+v_plane->widthStep*y))[x];
    
        if((*val>170))
          *hue=255;
        else
          *hue=0;
      }
    }
    

    将结果保留在色调通道中。不幸的是,这种方法对光线非常敏感。我相信有更好的办法。有什么建议吗?

    3 回复  |  直到 13 年前
        1
  •  2
  •   lornova    14 年前

    你为什么用HSV?转换为HSL并使用亮度通道更有意义。当然,你不会只得到白色,而是每一种亮度超过阈值的颜色。毕竟,除非你的源图像曝光过度,否则你不能依赖纯白色。

        2
  •  2
  •   Martin Beckett    14 年前

    它对光线很敏感——如果你在红灯下观看会发生什么!
    我不知道使用YUV空间是否比寻找类似的RGB值容易得多。

    编辑-通常你会调用没有灰色的东西(可能有助于搜索)。
    如果可以选择,这是最糟糕的颜色,因为它会反射场景中的任何其他灯光。因此,你必须检测整体照明颜色并进行调整。

    因此,你要寻找的是具有相似RGB值的像素,或者是场景中对象平均值的比率中的RGB值。

        3
  •  2
  •   Utkarsh Sinha    14 年前

    另一种方法是将图像转换为灰度。白色将具有非常高的值(几乎超过225)。

    还有另一种方法是去和R,G,B平面。结果图像中将只保留白色。这样,您就不用花时间计算转换到HSV颜色空间。你只是在每个像素上做一个简单的AND操作。