我正在尝试检测对象中的白色形状,并且可以成功地为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才能正常工作。我的问题 - 是否有一个很好的方法来确定使用正确的标量值?我知道这对某些人来说听起来很简单,但我因此而头疼!
答案 0 :(得分:2)
如果你在这里查看,你可以看到你的问题是什么。 RGB =(255,155,155)可能不是“白色”,但你的inRange方法给出的是真正的输出。
尝试使用HSL色彩空间。亮度>无论H和S通道值是多少,90都是白色的。使用BGR2HLS conversion.然后在90-100之间使用带R通道的inRange。
实际上,对于颜色检测问题,大多数使用的颜色空间是HSV和HSL,而不是RGB!
答案 1 :(得分:0)
可能无法自动确定适用于所有类型视频的阈值。但是为了减少对视频整体闪电的依赖,可以使其依赖于图像的平均或中值像素值。
或者,如果您知道对象在图像中的显示大小,则可以相应地选择阈值。
另一种方法可能是规范化视频的亮度。
但是哪种方法最能强烈依赖于您的确切情况和要求。