在OpenCV中使用InRange时如何选择合适的标量值

在OpenCV中使用InRange时如何选择合适的标量值,opencv,colors,range,scalar,threshold,Opencv,Colors,Range,Scalar,Threshold,我正在尝试检测对象中的白色形状,并且可以成功地检测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

我正在尝试检测对象中的白色形状,并且可以成功地检测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);
这给了我结果

但是,如果我使用不同的视频-那么标量值150可能不合适(例如,如果是光环境…所有内容都会被检测到)


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

可能无法自动确定适用于所有类型视频的阈值。但为了减少对视频整体亮度的依赖,可以根据图像的平均或中值像素值进行调整

或者,如果知道对象在图像中显示的大小,可以相应地选择阈值

另一种方法是使视频亮度正常化

但哪种方法最好取决于您的具体情况和要求。

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

尝试使用HSL颜色空间。无论H和S通道值是什么,亮度>90肯定是白色的。使用然后在范围内使用,L通道在90-100之间

实际上,对于颜色检测问题,最常用的颜色空间是HSV和HSL,而不是RGB