OpenCV 4.11.0
开源计算机视觉库
加载中…
搜索中…
未找到匹配项
Meanshift 和 Camshift

上一教程: 如何使用背景减除方法
下一教程: 光流

目标

在本章中,

  • 我们将学习 Meanshift 和 Camshift 算法,用于跟踪视频中的物体。

Meanshift

Meanshift 背后的直觉很简单。假设你有一组点。(它可以是像直方图反投影这样的像素分布)。给你一个小窗口(可能是一个圆圈),你必须将该窗口移动到像素密度最大(或点数最大)的区域。下图简单地说明了这一点

图像

初始窗口显示在蓝色圆圈中,名为“C1”。其原始中心用蓝色矩形标记,名为“C1_o”。但是,如果你找到窗口内点的质心,你会得到点“C1_r”(用小蓝色圆圈标记),它是窗口的真实质心。当然它们不匹配。所以移动你的窗口,使得新窗口的圆圈与之前的质心匹配。再次找到新的质心。很可能,它不会匹配。所以再次移动它,并继续迭代,直到窗口的中心及其质心落在相同的位置(或在一个小的期望误差范围内)。所以最终你得到一个具有最大像素分布的窗口。它用绿色圆圈标记,名为“C2”。正如你在图像中看到的,它具有最大数量的点。整个过程在下图的静态图像上进行了演示

图像

所以我们通常传递直方图反投影图像和初始目标位置。当物体移动时,运动显然会反映在直方图反投影图像中。结果,Meanshift 算法将我们的窗口移动到具有最大密度的新位置。

OpenCV 中的 Meanshift

要在 OpenCV 中使用 Meanshift,首先我们需要设置目标,找到其直方图,以便我们可以将目标反投影到每一帧中以计算 Meanshift。我们还需要提供窗口的初始位置。对于直方图,这里只考虑色调。此外,为了避免由于低光照导致的错误值,使用cv.inRange() 函数丢弃低光照值。

我使用的视频中包含的三个帧如下所示

图像

camshift

你仔细观察了最终结果吗?存在一个问题。无论汽车距离摄像机非常远还是非常近,我们的窗口大小始终相同。这不好。我们需要根据目标的大小和旋转来调整窗口大小。解决方案再次来自“OpenCV实验室”,它被称为CAMshift(连续自适应Meanshift),由Gary Bradsky在其1998年的论文“用于感知用户界面的计算机视觉人脸跟踪”中发表 [39]

它首先应用Meanshift。一旦Meanshift收敛,它会更新窗口大小,如下所示:\(s = 2 \times \sqrt{\frac{M_{00}}{256}}\)。它还会计算最适合它的椭圆的方向。它再次使用新的缩放搜索窗口和之前的窗口位置应用Meanshift。此过程持续进行,直到满足所需的精度。

图像

OpenCV中的Camshift

它类似于Meanshift,但是返回一个旋转矩形(即我们的结果)和框参数(在下次迭代中用作搜索窗口)。请参见下面的代码

结果的三个帧如下所示

图像

更多资源

  1. 关于 Camshift 的法语维基百科页面。(两个动画取自此处)
  2. Bradski, G.R., "Real time face and object tracking as a component of a perceptual user interface," Applications of Computer Vision, 1998. WACV '98. Proceedings., Fourth IEEE Workshop on , vol., no., pp.214,219, 19-21 Oct 1998

练习

  1. OpenCV带有一个Python 示例,用于camshift的交互式演示。使用它,修改它,理解它。