改进open cv中的camshift算法

时间:2011-02-09 15:55:57

标签: c++ opencv computer-vision

我使用opencv的camshift算法进行对象跟踪。输入是从网络摄像头获取的,并且在连续帧之间跟踪对象。如何使跟踪更强大?如果我以快速移动对象,则跟踪失败。此外,当对象不在帧中时,存在错误检测。我该如何改进?

3 个答案:

答案 0 :(得分:2)

对象跟踪是计算机视觉领域的一个活跃研究领域。有很多算法可以做到,而且它们都没有100%的时间都可以工作。

如果您需要实时跟踪,那么您需要简单快速的东西。我假设你有一种从背景中分割移动物体的方法。然后,您可以计算对象的表示,例如颜色直方图,并将其与下一帧中找到的对象进行比较。您还应检查对象在帧之间是否移动太远。如果你想尝试更高级的动作跟踪,那么你应该查找卡尔曼滤波器。

确定对象不在框架中也是一个大问题。首先,您要跟踪哪些对象?人?汽车?小狗?您可以构建一个对象分类器,它可以告诉您帧中的移动对象是否是您感兴趣的对象,而不是噪声或其他类型的对象。分类器可以是非常简单的东西,例如对大小的约束,或者它可以非常复杂。在后一种情况下,您需要了解可以计算的特征,分类算法,例如支持向量机,并且您需要收集训练图像来训练它。

简而言之,一个可靠的跟踪器并不容易构建。

答案 1 :(得分:1)

假设您在前两帧中找到了对象。根据该信息,您可以推断出第三帧中您期望对象的位置。您可以使用更慢,更复杂(因此希望更可靠)的算法,而不是使用通用的查找对象算法,通过限制它来检查外推预测的附近区域。它可能不完全符合您的预期(也许速度矢量正在改变),但您当然应该能够减少检查的区域。

这应该有助于减少帧的其他部分被错误识别为对象的次数(因为您正在查看帧的较小部分并且因为您正在使用更好的特征检测器)。

根据您找到的内容更新外推并迭代下一帧。

如果对象超出框架,则会回退到通用要素检测器,就像对前两帧一样,并在对象返回视图时再次尝试“锁定”。

此外,如果可以的话,尽可能多地投射到物理场景中。如果场景暗淡,摄像头将使用较长的曝光时间,从而导致移动物体上出现更多运动模糊。运动模糊会使特征检测器变得非常困难(尽管它可以为您提供有关方向和速度的信息)。

答案 2 :(得分:0)

我发现如果你在camShift中扩展搜索窗口的边界,它会使算法对快速移动的对象更具适应性,尽管它会引入一些不规则性。尝试让你的窗口边框大10%,看看会发生什么。