【问题标题】:Detecting Markers Using OpenCV使用 OpenCV 检测标记
【发布时间】:2011-05-30 23:19:04
【问题描述】:

我正在尝试检测包含彩色标记的各种对象,因此红色蓝色绿色标记标识对象 A,红色蓝色红色标记标识对象 B。我的问题是我无法使用模板匹配,因为对象可以旋转,目前我正在考虑检查每种颜色,然后通过检查颜色之间的距离来找到对象,但这似乎效率低下,所以我的问题是有更好的方法吗?

【问题讨论】:

  • 你能发一些图片吗?

标签: image-processing opencv computer-vision


【解决方案1】:

您可能想尝试制作局部颜色直方图,并使用颜色比率作为标识符。

【讨论】:

    【解决方案2】:

    这是我写的一篇关于tracking colored objects 的短文。这可能正是您想要的。

    【讨论】:

      【解决方案3】:

      对于一种稳健且有点 CPU 效率的方法,我建议您首先使用 cv::transform 转换图像,以便输出图像通道的非零值对应于您要跟踪的具有颜色的 blob。例如,

           b   g   r   bias
      r' [ -1  -1  1   -15 ]
      b' [ 1   -1  -1  -15 ]
      

      是一个转换矩阵,它将为非常红色的像素分配非零值到第一个输出通道,对于非常蓝色的像素到第二个输出通道。

      然后,您可以在输出通道上逐一运行 cv::findContours,以找到颜色合适的 blob。然后,通过对 blob 的对、3 元组等进行迭代并对它们进行一些几何检查(例如,如果您的标记由蓝色、红色和绿色的圆圈组成,您应该检查这三个 blob 是否为“圆形" 足够的形状和彼此靠近的位置可以将它们视为标记,而不仅仅是噪声)可以定位标记。

      要跟踪它们,您可以在运行 cv::transform 后对基于 meanShift 的跟踪应用某种 CAMShift,而不是每帧都重新运行上述算法。在 CAMShifting 的情况下,如果正在寻找一个稳健的跟踪器,则应该每帧检查被跟踪的对象是否仍然是标记。

      来自跟踪的原始位置(可能还有旋转)值通常会有些嘈杂。例如,如果房间里有荧光灯并使用红蓝标记,则跟踪可能会“闪烁”一点。作为补偿,卡尔曼滤波器或扩展卡尔曼滤波器是有用的,但引入了很多需要调整/猜测的参数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-04-09
        • 1970-01-01
        • 2018-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-29
        相关资源
        最近更新 更多