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

dnu*_*nul 5 opencv colors image-processing

我正在尝试检测视频中的白色物体.第一步是过滤图像,使其只留下白色像素.我的第一种方法是使用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;
  }
}
Run Code Online (Sandbox Code Playgroud)

将结果留在色调通道中.不幸的是,这种方法对照明非常敏感.我相信有更好的方法.有什么建议?

Mar*_*ett 2

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

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

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

  • 如果场景中有白色物体并用红光照亮它们,它们就会看起来是红色的!在这种情况下,您将必须找到“白色”物体的颜色并搜索该颜色 (3认同)