【问题标题】:How to choose appropriate Scalar values when using InRange in OpenCV在 OpenCV 中使用 InRange 时如何选择合适的标量值
【发布时间】:2013-07-19 16:12:26
【问题描述】:

我正在尝试检测对象中的白色形状,并且可以成功检测 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 左右才能正常工作。我的问题 - 有没有确定要使用的正确标量值的好方法?我知道这对某些人来说听起来很简单,但我因此而头疼!

【问题讨论】:

    标签: opencv colors range scalar threshold


    【解决方案1】:

    http://colorizer.org/

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2014-12-27
        • 2016-04-11
        • 1970-01-01
        • 2016-10-31
        • 1970-01-01
        • 1970-01-01
        • 2012-06-12
        相关资源
        最近更新 更多