我正在尝试检测包含彩色标记的各种对象,因此红色蓝色绿色标记标识对象A,红色蓝色红色标记标识对象B.我的问题是我无法使用模板匹配导致对象可以旋转,目前我正在考虑检查每种颜色然后通过检查颜色之间的距离找到对象,但它看起来效率低下,所以我的问题是有更好的方法来做到这一点吗?
答案 0 :(得分:5)
这是我写的关于tracking colored objects的简短文章。这可能就是你要找的东西。
答案 1 :(得分:0)
您可能想尝试使用局部颜色直方图,并使用颜色比率作为标识符。
答案 2 :(得分:0)
对于一个强大且有点CPU效率的方法,我建议你首先使用cv :: transform转换图像,这样输出图像通道的非零值对应于你想要跟踪的颜色的blob。例如,
b g r bias
r' [ -1 -1 1 -15 ]
b' [ 1 -1 -1 -15 ]
是一个变换矩阵,它将非常红色像素的非零值分配给第一个输出通道,而非蓝色像素分配给第二个输出通道。
然后,您可以逐个在输出通道上运行cv :: findContours,以找到有利颜色的blob。然后,通过迭代blob的三元组等,并对它们运行一些几何检查(例如,如果您的标记由蓝色,红色和绿色圆圈组成,则应检查三个斑点是否为“圆形” “足够形状并且彼此靠近以将它们视为标记而不仅仅是噪声”标记可以定位。
要跟踪它们,而不是每帧重新运行上述算法,您可以在运行cv :: transform后对基于meanShift的跟踪应用某种CAMShift。在CAMShifting的情况下,如果正在寻找一个强大的跟踪器,如果被跟踪的对象仍然是标记,则应该每帧检查一次。
来自跟踪的原始位置(可能是旋转)值通常会有些嘈杂。例如,如果房间内有荧光灯并使用红蓝标记,则跟踪可能会“闪烁”一下。为了补偿,卡尔曼滤波器或扩展卡尔曼滤波器很有用,但引入了许多要调整/猜测的参数。