meanshift跟踪算法原理及代码
来源:互联网 发布:c语言开发从入门到精通 编辑:程序博客网 时间:2024/05/02 02:20
【致谢】http://blog.csdn.net/luckydongbin/article/details/1534192
用meshift算法可以实时实现物体的跟踪,但是该方法因为基于颜色直方图因此对于颜色变化敏感,而且该法搜索窗口规定,同时不能实现较大幅度的跟踪,克服这个问题可以参考Camshift,opencv有实例。meanshift适用于单张图像。camshift适用于连续图像。
///cvmeanshift函数的使用
///cvMeanShift实质已简化为计算图像像素分布的重心。
///cvMeanShift用于跟踪还需要选择代表物体特征的分布,确定物体特征,在每一帧上根据特征分布寻找收敛点。
#include <stdlib.h>
#include <stdio.h>
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>
#include <math.h>
//using namespace std;
//using namespace cv;
void main()
{
char image_name[100];//存储打开文件名称
uchar* m_b = NULL;
IplImage* img = 0;
CvConnectedComp my_mp;
int win_width = 50;//初始搜索窗口
sprintf(image_name, "%s%s", "E:\\cvMeanShift\\lena",".bmp");
img = cvLoadImage(image_name);//打开图片
IplImage* img_shift = cvCreateImage(cvSize(img->width,img->height), IPL_DEPTH_8U, 1);
IplImage* pic = cvCreateImage(cvSize(img->width,img->height), IPL_DEPTH_8U, 3);
cvCvtColor(img, img_shift, CV_BGR2GRAY);//必须是单通道图片才可以
cvNamedWindow( "mainWin");//创建窗口
cvMeanShift(img_shift, cvRect(50,80,win_width,win_width),cvTermCriteria(CV_TERMCRIT_ITER|CV_TERMCRIT_EPS, 1000, 0.1), &my_mp);//img_shift:单通道图像;cvRect:初始窗口;1000指迭代次数,0.1指的是迭代条件 cvTermCriteria(CV_TERMCRIT_ITER|CV_TERMCRIT_EPS, 1000, 0.1) 满足次数1000或者精度0.1停止迭代。
///my_mp是返回值,里面存储结果,其中my_mp->rect是收敛后窗口位置,my_mp->area是最终窗口中所有像素点的和。
///cvMeanShift实质已简化为计算图像像素分布的重心。
CV_IMAGE_ELEM(img_shift, uchar, my_mp.rect.y+win_width/2, my_mp.rect.x+win_width/2) = 255;//提取某点象素值;把最后的收敛窗口标出来,一个纯白的亮点
printf("收敛点已经标注为白色亮点\n");
cvCvtColor(img_shift, pic, CV_GRAY2BGR);
cvSaveImage("E:\\cvMeanShift\\lena_after_mean.bmp", pic);
cvShowImage("mainWin", img_shift);
cvWaitKey(0);
cvDestroyWindow("mainWin");
cvReleaseImage(&img);
cvReleaseImage(&img_shift);
cvReleaseImage(&pic);
}
【以下转自】http://blog.csdn.net/luckydongbin/article/details/1534192
meanshift是由Comaniciu最先提出来,是用于跟踪非刚性物体的一种算法。本的介绍也是源自Comaniciu的文章。下面是文章的一些基本信息:
Title:Kernel-Based Object Tracking
Authors:Dorin Comaniciu, Senior Member, IEEE, Visvanathan Ramesh, Member, IEEE, and Peter Meer, Senior Member, IEEE
Publication:IEEE TRANSACTIONS ON PATTERN ANALYSIS AND MACHINE INTELLIGENCE, VOL. 25, NO. 5, MAY 2003.pp564-577.
同时,由于公式不容易直接粘贴过来,读者如有兴趣或疑问,请参考原文。另外,这里只介绍主要算法。
为了表征目标,首先需要选择一个特征空间。参考目标,用在特征空间中概率密度函数q表示,例如参考模型可以选择目标的颜色概率密度函数。不失一般性,目标模型可以认为中心处于其所在空间的中心。在下一帧候选目标被定义为在位置y,用概率密度函数p(y)来表示。为了满足实时性的要求,它们分别用非参数的方法中的直方图统计^q和^p(y)表示。
目标和候选直方图之间的相似度函数记作公式(1),相似度的局部最大意味着在候选模型与目标模型匹配。如果仅考虑颜色信息,候选区域的相似度变化会很大,匹
配效果不好。为了得到一个连续性的相似度函数,在空间域内,用一个核函数对目标
区域做滤波处理。
目标模型中的特征概率可以用等式(2)来计算,其中表示归一化的像素位置,k(x)是一个凸的单调递减的核函数,它为距离中心远的像素分配小的权值,距离中心近的像素分配大的权值,b表示位置直方图索引,C为归一化常数。同理,对于目标候选模型也是用同样的k(x),但是带有带宽h,特征概率可以用等式(4)来计算。相似度函数定义了目标模型和候选模型的距离, ^p和^q 的相似度函数用Bhattacharyya系数表示,公式(8,9)。
在当前帧中,目标模型的匹配位置就是等式(9)中第二项的最大值。可以看出,在当前帧下,等式(9)的第二项用y位置核截面用k(x)的计算的概率密度和权重w表示。在邻域内,可以应用Meanshift过程找到最大的模式。在这个过程中,核通过等式(11) 从当前位置^y0移动到新的位置^y1。如此,循环迭代实现目标的跟踪。
- meanshift跟踪算法原理及代码
- meanshift跟踪算法及源码
- 基于MeanShift的视频目标跟踪算法及代码实现
- 跟踪算法->Meanshift算法
- meanshift跟踪原理
- meanShift跟踪算法概述
- MeanShift跟踪算法
- meanshift跟踪算法总结
- MeanShift 目标跟踪算法
- meanshift跟踪算法详解
- meanshift跟踪算法
- Matlab实现meanshift算法,目标跟踪代码实现
- 基于MeanShift的目标跟踪算法及实现
- 基于MeanShift的目标跟踪算法及实现
- 基于MeanShift的目标跟踪算法及实现
- 基于MeanShift的目标跟踪算法及实现
- 基于MeanShift的目标跟踪算法及实现
- 基于MeanShift的目标跟踪算法及实现
- MyEclipse 配置环境错误
- Numbers-实现成绩的查找比较
- ruby构建工具
- 大老的原创工具之著名的反编译 ida Pro 6.4 Plus 带保存功能最终版来了
- c#多线程(UI线程,控件显示更新) Invoke和BeginInvoke 区别
- meanshift跟踪算法原理及代码
- UITableView执行顺序及Segue必须要实现的方法
- iOS应用开发最佳实践:编写高质量的Objective-C代码
- 无线路由器硬件配置参数 NetGear篇
- C# DirectX 使用例子
- Linux中最危险的10个命令
- ruby rspec
- Servlet 3.0 新特性概览
- tomcat设置端口问题