【问题标题】:Detecting Markers Using OpenCV使用 OpenCV 检测标记
【发布时间】:2011-05-30 23:19:04
【问题描述】:
我正在尝试检测包含彩色标记的各种对象,因此红色蓝色绿色标记标识对象 A,红色蓝色红色标记标识对象 B。我的问题是我无法使用模板匹配,因为对象可以旋转,目前我正在考虑检查每种颜色,然后通过检查颜色之间的距离来找到对象,但这似乎效率低下,所以我的问题是有更好的方法吗?
【问题讨论】:
标签:
image-processing
opencv
computer-vision
【解决方案1】:
您可能想尝试制作局部颜色直方图,并使用颜色比率作为标识符。
【解决方案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 的情况下,如果正在寻找一个稳健的跟踪器,则应该每帧检查被跟踪的对象是否仍然是标记。
来自跟踪的原始位置(可能还有旋转)值通常会有些嘈杂。例如,如果房间里有荧光灯并使用红蓝标记,则跟踪可能会“闪烁”一点。作为补偿,卡尔曼滤波器或扩展卡尔曼滤波器是有用的,但引入了很多需要调整/猜测的参数。