检测白色的最佳方法是什么?

时间:2010-06-17 20:58:36

标签: image-processing colors opencv

我正在尝试检测视频中的白色物体。第一步是过滤图像,使其只留下白色像素。我的第一种方法是使用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 个答案:

答案 0 :(得分:2)

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

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

所以你要找的是具有相同RGB值的像素,或者是场景中物体平均比例的RGB值。

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

另一种方式是和R,G和B飞机。只有白色才会留在最终图像中。这样,您就不会花时间计算转换为HSV色彩空间。你只是在每个像素上做一个简单的AND操作。