2010-06-17 46 views
5

我试图检测视频中的白色物体。第一步是过滤图像,使其仅保留白色像素。我的第一种方法是使用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; 
    } 
} 

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

回答

2

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

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

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

+0

我的意思是白色=灰色=没有颜色,实际上我试图检测白色塑料眼镜。这里是一个示例图片: http://tinypic.com/r/14t1p1x/6 – dnul 2010-06-17 21:11:37

+0

我不确定,你是说如果我在顶部放一盏红灯,那么眼镜的颜色会变成某种偏红色而不是寻找白色像素,我应该寻找类似的像素,无论颜色? – dnul 2010-06-17 23:32:52

+3

如果你在场景中有白色物体,并用红光点亮它们,它们将看起来红色!在这种情况下,您将不得不查找“白色”对象的颜色并搜索该颜色 – 2010-06-18 00:02:46

2

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

2

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

还有另外一种方法是和R,G和B平面。只有白人会留在最终的图像。这样,你就不用花时间计算转换到HSV色彩空间。你只是在每个像素处进行简单的AND操作。

相关问题