1

我正在尝试检测对象中的白色形状,并且可以成功地为 1 个视频做到这一点。

// Create and display a new matrix for triangles
triangles = src.clone();
GaussianBlur(triangles, triangles, Size(5, 5), 0, 0);
inRange(triangles, Scalar(150,150,150), Scalar(255, 255, 255), triangles);
imshow("triangles", triangles);

这给了我结果

http://s8.postimg.org/o9xg284jp/triangles.png

但是,如果我使用不同的视频 - 那么标量值 150 可能不合适(例如,如果它是一个光照环境......一切都会被检测到)

http://s8.postimg.org/m09brgvlx/bad_triangles.png

对于这个视频,我需要将最小标量更改为 190-200 左右才能正常工作。我的问题 - 有没有确定要使用的正确标量值的好方法?我知道这对某些人来说听起来很简单,但我因此而头疼!

4

2 回答 2

2

http://colorizer.org/

如果你在这里检查,你可以看到你的问题是什么。RGB = (255, 155, 155) 可能不是“白色”,但您的 inRange 方法正在为那个提供真正的输出。

尝试使用 HSL 颜色空间。亮度 > 90 肯定是白色,无论 H 和 S 通道值是多少。使用BGR2HLS 转换。然后在 90-100 之间使用带有 L 通道的 inRange。

实际上,对于颜色检测问题,主要使用的颜色空间是 HSV 和 HSL,而不是 RGB!

于 2013-07-19T18:45:31.760 回答
0

可能无法自动确定适用于所有类型视频的阈值。但为了减少对视频整体闪电的依赖,您可以使其依赖于图像的平均或中值像素值。

或者,如果您知道对象在图像中出现的大小,则可以相应地选择阈值。

另一种方法可能是标准化视频的亮度。

但哪种方法最好在很大程度上取决于您的具体情况和要求。

于 2013-07-19T17:33:45.413 回答