我正在尝试检测视频中的白色物体。第一步是过滤图像,使其只留下白色像素。我的第一种方法是使用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;
}
}
将结果留在色调通道中。不幸的是,这种方法对照明非常敏感。我相信有更好的方法。有什么建议吗?
答案 0 :(得分:2)
它会对照明敏感 - 如果你在红灯下观察它会发生什么! 我不知道使用YUV空间是否比寻找类似的RGB值容易得多。
编辑 - 通常你会调用没有灰色的东西(可能会帮助你进行搜索) 如果您有选择,这是要搜索的最差颜色,因为它会反映场景中的任何其他光照。因此,您必须检测整体灯光颜色并进行调整。
所以你要找的是具有相同RGB值的像素,或者是场景中物体平均比例的RGB值。
答案 1 :(得分:2)
您为什么使用HSV?转换为HSL并使用亮度通道会更有意义。当然,你不会只获得白色,而是每种颜色都具有超过阈值的高亮度。毕竟,除非源图像曝光过度,否则不能依赖纯白色。
答案 2 :(得分:2)
另一种方法是将图像转换为灰度。白色将具有非常高的值(几乎> 225)。
另一种方式是和R,G和B飞机。只有白色才会留在最终图像中。这样,您就不会花时间计算转换为HSV色彩空间。你只是在每个像素上做一个简单的AND操作。