meanShift跟踪算法概述

转自:http://blog.csdn.net/carson2005/article/details/7337432

meanShift,均值漂移,在聚类、图像平滑、分割、跟踪等方面有着广泛的应用。meanShift这个概念最早是由Fukunage1975年提出的,其最初的含义正如其名:偏移的均值向量;但随着理论的发展,meanShift的含义已经发生了很多变化。如今,我们说的meanShift算法,一般是指一个迭代的步骤,即先算出当前点的偏移均值,然后以此为新的起始点,继续移动,直到满足一定的结束条件。

在很长一段时间内,meanShift算法都没有得到足够的重视,直到1995年另一篇重要论文的发表。该论文的作者Yizong Cheng定义了一族核函数,使得随着样本与被偏移点的距离不同,其偏移量对均值偏移向量的贡献也不同。其次,他还设定了一个权重系数,使得不同样本点的重要性不一样,这大大扩展了meanShift的应用范围。此外,还有研究人员将非刚体的跟踪问题近似为一个meanShift的最优化问题,使得跟踪可以实时进行。目前,利用meanShift进行跟踪已经相当成熟。

meanShift算法其实是一种核密度估计算法,它将每个点移动到密度函数的局部极大值点处,即,密度梯度为0的点,也叫做模式点。在非参数估计部分(请参考http://blog.csdn.net/carson2005/article/details/7243425),我们提到,多维核密度估计可以表示为:



估计为0meanShift向量也总是指向密度增加最大的方向,这可以由上式中的分子项来保证,而分母项则体现每次迭代核函数移动的步长,在不包含感兴趣特征的区域内,步长较长,而在感兴趣区域内,步长较短。也就是说,meanShift算法是一个变步长的梯度上升算法,或称之为自适应梯度上升算法。


转自:http://www.aiseminar.cn/bbs/forum.php?mod=viewthread&tid=1269
均值平移(Mean Shift)

在2000年,Dorin Comaniciu等人将Mean Shift 算法引入目标跟踪领域,提出的Mean Shift跟踪算法[16-21]。算法利用可视化特征,如颜色、纹理等的统计信息描述跟踪的目标,通过Mean Shift 迭代搜索与跟踪目标模板具有最大相似度的候选目标区域,以此实现对当前帧中目标的定位和跟踪。

1. Mean Shift 跟踪算法

正如本文对算法的分类所示,Mean Shift 跟踪算法属于模式搜索与匹配算法。它首先分析目标,提取特定模式;然后,利用启发式算法,在搜索空间中选定候选区域,并将目标模式与候选区域模式相比较;依此,循环迭代,在搜索空间中找到最佳匹配的候选区域,作为要查找的目标。因此,算法有三个关键工作:选择目标模式、确定比较匹配算法,以及寻找启发式搜索策略。下面由此三方面对此算法做简单介绍。

(1)目标模式:颜色的核直方图
Mean Shift 跟踪算法是基于模式匹配的机理,因此,在运行前,需要人为给出目标区域。在一帧图像I中,目标所在的区域为目标区域,用O表示。它以外的区域为背景,用B表示。包含了全部目标,又不可避免的含有少量背景区域的圆形区域T,称为跟踪窗口[18]。

由目标区域O,得到跟踪窗口T。以T的圆心为坐标原点,重新分配图像中各像素点的坐标{xi}, i = 1, 2, ..., n。定义一个映射b: R^2 -> {1, 2, ..., m},它将每个像素的二维坐标,映射到其对应像素颜色值应划分的直方区间m上。颜色值u在目标模型中的概率是通过核函数k计算得到。k是一个凸单调递减函数,它根据像素距离目标中心的距离,给此像素对颜色u概率的贡献设置一个权值,像素距离中心越远,权值越小。以此模拟距离目标中心越远,属于目标的可能性越小,增加了算法的鲁棒性。这样,就得到了Mean Shift 跟踪算法目标的模式表示,目标颜色的核直方图[16, 18]。

跟踪窗口T中包含目标O的核直方图 定义,形式化描述为:

meanshift1.jpg 
   公式2.10

其中,δ是Kronecker delta函数[16],m 是直方图对颜色进行的量化级数,C为m 个“直方”的概率的归一化常数,h 为跟踪窗口T 的半径。

目标模型确定后,便是搜索匹配的候选模型。候选模型的核直方图计算方法相同,先选定候选目标中心y,计算半径为h 的跟踪窗口内的图像的核直方图 Qy = {qi}, i = 1, 2, ..., m。另外,候选的目标中心y 的坐标取值,可以在整个图片的范围,具体搜索策略,后面将继续介绍。

(2)相似度计算:Bhattacharyya 系数

目标模式和候选目标模式都是具有m 个分量的核直方图P 和Q,它们是两个离散的概率分布。而在统计学中,巴氏系数(Bhattachryya coefficient)用来衡量两离散概率分布的可分离误差,误差越大越不宜分离,亦即两者越相似。因此,Mean Shift 跟踪理所当然的选用它作为衡量目标与候选目标相似度的工具。根据Bhattachryya 系数的定义,P 和Q 的相似性 描述如下:

meanshift2.jpg 
   公式2.11

依此,便可以判断目标与候选目标的相似度,并在整个图像范围内找到最优匹配。

(3)搜索策略:Mean Shift 矢量

确定了目标的模型或模式,以及相似度计算方法,下面就需要使用较好的启发式策略在候选空间中寻找最佳匹配的目标。在跟踪问题中,由给出目标区域的帧图像,得到目标模型,接着便要在未来帧图像中寻找最可能的目标区域。因此,目标的搜索匹配空间为整个帧图像。运用启发式策略,就是要尽量避免搜索整个空间,而是使用最便捷、有效的方式得到目标。

Mean Shift 跟踪算法是沿着Mean Shift 矢量方向不断移动核函数中心位置到收敛,以此方式寻找邻近的最佳匹配模式中心y即可。


转自:http://blog.csdn.net/carson2005/article/details/7341051

meanShift优缺点:

meanShift算法用于视频目标跟踪时,采用目标的颜色直方图作为搜索特征,通过不断迭代meanShift向量使得算法收敛于目标的真实位置,从而达到跟踪的目的。

传统的meanShift算法在跟踪中有几个优势:

(1)算法计算量不大,在目标区域已知的情况下完全可以做到实时跟踪;

(2)采用核函数直方图模型,对边缘遮挡、目标旋转、变形和背景运动不敏感。

同时,meanShift算法也存在着以下一些缺点:

(1)缺乏必要的模板更新;

(2)跟踪过程中由于窗口宽度大小保持不变,当目标尺度有所变化时,跟踪就会失败;

(3)当目标速度较快时,跟踪效果不好;

(4)直方图特征在目标颜色特征描述方面略显匮乏,缺少空间信息;

由于其计算速度快,对目标变形和遮挡有一定的鲁棒性,所以,在目标跟踪领域,meanShift算法目前依然受到大家的重视。但考虑到其缺点,在工程实际中也可以对其作出一些改进和调整;例如:

(1)引入一定的目标位置变化的预测机制,从而更进一步减少meanShift跟踪的搜索时间,降低计算量;

(2)可以采用一定的方式来增加用于目标匹配的“特征”;

(3)将传统meanShift算法中的核函数固定带宽改为动态变化的带宽;

(4)采用一定的方式对整体模板进行学习和更新;

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 背景 Meanshift算法是一种基于概率密度函数的图像跟踪算法,它可以用于物体跟踪、目标跟踪等领域。本文将介绍Meanshift算法的原理和实现方式。 2. 原理 Meanshift算法是基于概率密度函数的图像跟踪算法,其基本原理是根据当前帧中目标的位置和大小,计算出目标模型的概率密度函数,然后将该函数与下一帧中的图像进行卷积,得到目标在下一帧中的位置和大小。 具体实现步骤如下: 1)选择一个初始窗口,在该窗口内计算出目标的概率密度函数。 2)在下一帧中,将原始图像和目标模型的概率密度函数进行卷积,得到新的目标位置和大小。 3)重复上述过程,直到目标跟踪结束。 3. 实现 下面是一个简单的Meanshift跟踪算法的实现代码: ``` #include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace std; int main() { // 读入视频 VideoCapture cap("test.mp4"); if (!cap.isOpened()) { cout << "视频读入失败" << endl; return -1; } // 初始化目标窗口 Rect trackWindow(0, 0, 0, 0); Mat frame, hsv, mask, hist, backproj; // 设置迭代终止条件 TermCriteria termCrit(TermCriteria::EPS | TermCriteria::COUNT, 10, 1); // 开始循环跟踪 while (true) { // 读入当前帧 cap >> frame; if (frame.empty()) break; // 将当前帧转换为HSV颜色空间 cvtColor(frame, hsv, COLOR_BGR2HSV); // 计算目标模型的直方图 if (trackWindow.area() <= 0) { int x = frame.cols / 2; int y = frame.rows / 2; int w = 100; int h = 100; trackWindow = Rect(x - w / 2, y - h / 2, w, h); // 提取ROI Mat roi(hsv, trackWindow); Mat maskroi; inRange(roi, Scalar(0, 60, 32), Scalar(180, 255, 255), maskroi); Mat hsv_roi(hsv, trackWindow); calcHist(&hsv_roi, 1, 0, maskroi, hist, 2, &histSize, &histRange, uniform, accumulate); normalize(hist, hist, 0, 255, NORM_MINMAX); } // 计算反向投影 calcBackProject(&hsv, 1, 0, hist, backproj, &histRange); backproj &= mask; // 调用meanshift算法 meanShift(backproj, trackWindow, termCrit); // 在图像中绘制跟踪结果 rectangle(frame, trackWindow, Scalar(0, 0, 255), 2); // 显示图像 imshow("跟踪结果", frame); // 按下ESC键退出 if (waitKey(1) == 27) break; } return 0; } ``` 在上述代码中,首先读入视频,并初始化跟踪目标的窗口。然后在循环中,对于每一帧图像,将其转换为HSV颜色空间,并计算目标模型的直方图。接着计算反向投影,并调用meanshift算法进行跟踪。最后在图像中绘制跟踪结果,并进行显示。当按下ESC键时退出程序。 4. 总结 本文介绍了Meanshift跟踪算法的原理和实现方式,以及一个简单的OpenCV C++实现代码。该算法可以用于物体跟踪、目标跟踪等领域,并且具有较高的运行效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值