改进 open cv 中的 camshift 算法

Posted

技术标签:

【中文标题】改进 open cv 中的 camshift 算法【英文标题】:Improving camshift algorithm in open cv 【发布时间】:2011-02-09 15:55:56 【问题描述】:

我正在使用 opencv 的 camshift 算法进行对象跟踪。输入来自网络摄像头,并在连续帧之间跟踪对象。我怎样才能使跟踪更强大?如果我快速移动对象,跟踪将失败。此外,当对象不在框架中时,也会出现错误检测。我该如何改进呢?

【问题讨论】:

我认为仅靠 camshift 算法并不能解决这个问题。 选择跟踪算法很大程度上取决于您要跟踪的对象类型。您是在跟踪还是仅定位对象? 【参考方案1】:

对象跟踪是计算机视觉中一个活跃的研究领域。有很多算法可以做到这一点,但没有一个算法能 100% 工作。

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

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

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

【讨论】:

【参考方案2】:

假设您在前两帧中找到对象。从这些信息中,您可以推断出第三帧中对象的预期位置。您可以使用更慢、更复杂(因此希望更可靠)的算法,而不是使用通用的查找对象算法,方法是将其限制在外推预测的附近进行检查。它可能不是您期望的确切位置(也许速度矢量正在改变),但您当然应该能够减少检查的区域。

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

根据您的发现更新推断并为下一帧迭代。

如果对象超出帧,您将回退到通用特征检测器,就像处理前两帧一样,并在对象返回视图时再次尝试获取“锁定”。

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

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于改进 open cv 中的 camshift 算法的主要内容,如果未能解决你的问题,请参考以下文章

使用Python,OpenCV的Meanshift 和 Camshift 算法来查找和跟踪视频中的对象

常用视频目标跟踪算法仿真对比:帧间差分法,背景差分法,光流法,Meanshift,Camshift

39 Meanshift 和 和 Camshift

我无法在 openCV 中运行 camshift 演示

目标跟踪--CamShift

基于二轴云台目标跟踪系统设计