基于Camshift算法的目标追踪
agneto
最近在做无人机的目标追踪,于是了解了下camshift算法。找了好多资料,发现好多论文中的概念没有解释,就在这里整理下,顺便翻译了部分camshift论文内容。
1.公式全部LaTeX手打,写了简单的meanshift算法的matlab实现。
2.原论文的部分翻译在最下面,点目录就可以了。
3.opencv的camshift整个解析我也贴出来,整理了好久。
Meanshift算法简介
Meanshift算法是camshift算法的核心,处理方法可以说几乎相同,camshift仅仅是针对meanshift在连续帧情况下的优化版本罢了。meanshift是在一幅图上通过概率密度不断迭代找到最优解,而camshift是在连续帧情况下,一副一副图采用meanshift时优化了,继承上一帧图像最优解的窗口为起点继续meanshift迭代下一帧而不是新一帧又从头开始搜索。
Meanshift的opencv版本
这是opencv中meanshift的简要流程图,moment的概念在下面论文那里。
在下面写了代码的解读。
back-projection算法
反向投影算法简要讲就是在计算图像的直方图后将直方图各分区再投影回去作为像素的值。一般讲rgb图像转换为hsv色域再取h(hue)分量进行反向投影。
opencv实现:在histogram.cpp里面,先调用cv::calcBackProject,在里面再根据输入参数格式调用原函数模板calcBackProj_,源码就不在这里贴了。
Measnshift算法详细介绍
上面是opencv版本的meanshift算法,但按照1995年论文(链接)的优化版本,选定roi区域的概率密度计算增加了一个权重函数,根据距离不同贡献也不同。
非参数估计
meanshift算法属于非参数估计,需要的先验知识少,从目前数据进行估计。这里有篇博客(链接,这个部分不翻了网上好多解释)解释得很清楚,里面详细讲解了三种非参数估计方法。要了解meanshift原理需要了解推荐这篇博客里的核密度估计。
核密度估计
看完上面那篇博客的介绍,就可以简单了解到,核密度估计与直方图十分相似。先拿公式吓唬一下:
h是 带宽,K(x)是 核函数。直方图是将值域划分为几个区间进行累加,而核密度估计则是在将值域划分为几个区域(称之为bin)之后,每个数据不再是以1为单位进行累加,而是以每个数据乘以一个核函数K(x)作为权重进行累加。
K(x)一般采用高斯核函数和Epanechnikov核函数。同时顶一个profile函数满足 K:[0,∞)→R ,即 K(x)=k(||x||) ,原式子变成:
Meanshift的matlab实现
过程解释
计算权重有点特别
clear all;
close all;
%读入追踪图像
imglocation='/Users/Desktop/img.jpg' %图像储存位置
I=imread(imglocation);
[temp,rect]=imcrop(I); %imcrop用于选取ROI区域
[a,b,c]=size(temp); %a:row,b:col
%计算距离权重矩阵
y(1)=a/2;
y(2)=b/2;
tic_x=rect(1)+rect(3)/2;
tic_y=rect(2)+rect(