搜档网
当前位置:搜档网 › 基于MeanShift算法的目标跟踪

基于MeanShift算法的目标跟踪

基于MeanShift算法的目标跟踪
基于MeanShift算法的目标跟踪

基于MeanShift算法的目标跟踪

1 算法描述

1.1 meanshift算法背景

meanShift这个概念最早是由Fukunage在1975年提出的,Fukunage等人在一篇关于概率密度梯度函数的估计中提出这一概念。其最初的含义正如其名:偏移的均值向量;但随着理论的发展,meanShift的含义已经发生了很多变化。如今,我们说的meanShift算法,一般是指一个迭代的步骤,即先算出当前点的偏移均值,然后以此为新的起始点,继续移动,直到满足一定的结束条件。

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

1.2 meanshift算法原理

Meanshift可以应用在很多领域,比如聚类,图像平滑,图像分割,还在目标跟踪领域有重要的应用。Meanshift跟踪算法是通过计算候选目标与目标模板之间相似度的概率密度分布,然后利用概率密度梯度下降的方向来获取匹配搜索的最佳路径,加速运动目标的定位和降低搜索的时间,因此其在目标实时跟踪领域有着很高的应用价值。

该算法由于采用了统计特征,因此对噪声具有很好的鲁棒性;由于是一个蛋参数算法,容易作为一个模块和其他算法集成;采用核函数直方图建模,对边缘阻挡、目标的旋转、变形以及背景运动都不敏感;同时该算法构造了一个可以用meanshift算法进行寻优的相似度函数。Meanshift本质上是最陡下降法,因此其求解过程收敛速度快,使得该算法具有很好的实用性。

Meanshift算法的思想是利用概率密度的梯度爬升来寻找局部最优。它要做的就是输入一个在图像的范围,然后一直朝着重心迭代,直到满足你的要求或者达到迭代最大次数结束。在opencv中,进行meanshift其实很简单,输入一张图像(imgProb),再输入一个开始迭代的方框(windowIn)和一个迭代条件(criteria),输出的是迭代完成的位置(comp )。这是函数原型:

int cvMeanShift( const void* imgProb, CvRect windowIn,

CvTermCriteria criteria, CvConnectedComp* comp )

参数介绍:

imgProb:目标直方图的反向投影

windowIn:初试的搜索框

Criteria:确定搜索窗口的终止条件

Comp:生成的结构,包含收敛的搜索窗口坐标(comp->rect 字段) 与窗口内部所有像素的和(comp->area 字段)

1.3 meanshift算法跟踪目标实现步骤

1.首先从摄像头或者本地文件读入视频

2.选择要跟踪的物体,程序读取一帧视频

3.计算视频帧的色调直方图

4.计算视频帧的反向投影图

5.输入反向投影图和跟踪矩形框,调用meanshift算法迭代,寻找局部最优解。根据重心的移动,调整跟踪矩形框

6.读取下一帧视频,用当前矩形框作为输入,重复执行步骤2-5

1.4 meanshift算法实现过程

1 在颜色概率分布图中选取搜索窗W

2 计算零阶距:

计算一阶距:

计算搜索窗的质心:

3 调整搜索窗大小

宽度为

长度为1.2s

4 移动搜索窗的中心到质心,如果移动距离大于预设的固定阈值,则重复2)3)4),直到搜索窗的中心与质心间的移动距离小于预设的固定阈值,或者循环运算的次数达到某一最大值,停止计算。

1.5 meanshift算法跟踪效果

使用摄像头跟踪人的肤色效果如图1.5.1所示。

图 1.5.1 对应于图1.5.1的反向投影图如下图1.5.2所示。

图 1.5.2

点选区域的像素点直方图如图1.5.3所示。

图 1.5.3

从以上效果图可以发现,meanshift算法处理的是HSV中的色调分量。换句话说,就是通过追踪相同的颜色,而达到追踪物体的功能。程序首先计算点选框里的有效像素点,通过统计获得像素点分布直方图;然后计算出视频的反向投影图,即是像素点的概率分布图。如上图1.5.2所示,越亮的点就是与原物体越匹配的点,大量的亮点的聚集处就极有可能是需要跟踪的物体;最后用矩形框框住当前帧中带跟踪的物体,如上图1.5.1所示的结果。

当被跟踪的物体的色调与背景相似时,跟踪就会失效,如图1.5.4所示。

图 1.5.4

显然,当背景与被跟踪物体颜色难以区分时跟踪会失败。原因很简单,meanshift算法实现跟踪的原理就是通过计算色调的概率分布达到跟踪的效果,所以待跟踪的物体一定要与背景在色调上有区分度。

类似的,本程序也可以通过设置:调试->命令参数,使用本地的视频文件来实现视频中特定物体的跟踪,具体方法如图1.5.5所示。由于实验的效果与使用摄像头跟踪物体差不多,所以就不一一截图显示了。

图 1.5.5

2 程序源码与数据结构

#include

#include"stdafx.h"

#ifdef _CH_

#pragma package

#endif

#ifndef _EiC

#include

#include"cv.h"

#include"highgui.h"

#include

#endif

IplImage *image = 0, *hsv = 0, *hue = 0, *mask = 0, *backproject = 0, *histimg = 0; //用HSV中的Hue分量进行跟踪

CvHistogram *hist = 0;

//直方图类

int backproject_mode = 0;

int select_object = 0;

int track_object = 0;

int show_hist = 1;

CvPoint origin;

CvRect selection;

CvRect track_window;

CvBox2D track_box;

//Meanshift跟踪算法返回的Box类

//typedef struct CvBox2D{

//CvPoint2D32f center; /* 盒子的中心*/

//CvSize2D32f size; /* 盒子的长和宽*/

//float angle; /* 水平轴与第一个边的夹角,用弧度表示*/

//}CvBox2D;

CvConnectedComp track_comp;

//连接部件

//typedef struct CvConnectedComp{

//double area; /* 连通域的面积*/

//float value; /* 分割域的灰度缩放值*/

//CvRect rect; /* 分割域的ROI */

//} CvConnectedComp;

int hdims = 32;

//划分直方图bins的个数,越多越精确

float hranges_arr[] = {0,180};

//像素值的范围

float* hranges = hranges_arr;

//用于初始化CvHistogram类

int vmin = 10, vmax = 256, smin = 30;

//用于设置滑动条

int cvmeanshift(const void *imgProb,CvRect windowIn, CvTermCriteria criteria, CvConnectedComp* comp) //实现meanshift算法

{

CvMoments moments; //CvMoments用来计算矩形的重心,面积等形状特征

int i=0,eps;

CvMat stub, *mat=(CvMat*)imgProb;

CvMat cur_win;

CvRect cur_rect=windowIn; //当前矩形框

CV_FUNCNAME("cvmeanshift");

if(comp) //初始化跟踪矩形

{

comp->rect=windowIn;

}

moments.m00=moments.m01 =moments.m10 =0; //将阶矩和阶矩置

__BEGIN__;

CV_CALL(mat=cvGetMat(mat,&stub));

if( CV_MA T_CN( mat->type ) > 1 ) //通道数选择出错

{

CV_ERROR( CV_BadNumChannels, cvUnsupportedFormat );

}

if( windowIn.height <= 0 || windowIn.width <= 0 ) //点选的窗口无效

{

CV_ERROR( CV_StsBadArg, "Input window has non-positive sizes" );

}

if( windowIn.x < 0 || windowIn.x + windowIn.width > mat->cols ||windowIn.y < 0 || windowIn.y + windowIn.height > mat->rows )

{

CV_ERROR( CV_StsBadArg, "Initial window is not inside the image ROI" );

}

CV_CALL( criteria = cvCheckTermCriteria( criteria, 1., 100 )); //迭代的标准,精度=1.0,迭代次数=100

eps = cvRound( criteria.epsilon * criteria.epsilon ); //精度eps=1

for( i = 0; i < criteria.max_iter; i++ )

{

int dx, dy, nx, ny;

double inv_m00;

//选取搜索区域,对该矩形区域计算它的,1阶矩

CV_CALL( cvGetSubRect( mat, &cur_win, cur_rect ));

CV_CALL( cvMoments( &cur_win, &moments ));

/* Calculating center of mass */

if( fabs(moments.m00) < DBL_EPSILON )

{

break;

}

//搜索区域的质量m00

inv_m00 = moments.inv_sqrt_m00*moments.inv_sqrt_m00;

//搜索区域的水平重心偏移dx

dx = cvRound( moments.m10 * inv_m00 - windowIn.width*0.5 ); //搜索区域的垂直重心偏移dy

dy = cvRound( moments.m01 * inv_m00 - windowIn.height*0.5 ); //搜索区域的重心坐标(nx,ny)

nx = cur_rect.x + dx;

ny = cur_rect.y + dy;

//跟踪目标处于图像边缘时进行一些对应的处理

if( nx < 0 )

{

nx = 0;

}

else if( nx + cur_rect.width > mat->cols )

{

nx = mat->cols - cur_rect.width;

}

if( ny < 0 )

{

ny = 0;

}

else if( ny + cur_rect.height > mat->rows )

{

ny = mat->rows - cur_rect.height;

}

dx = nx - cur_rect.x;

dy = ny - cur_rect.y;

cur_rect.x = nx;

cur_rect.y = ny;

/* Check for coverage centers mass & window */

//精度达到要求时就可以退出循环

if( dx*dx + dy*dy < eps )

{

break;

}

}

__END__;

if(comp)

{

comp->rect=cur_rect;

comp->area=(float)moments.m00; //图像面积}

return i;

}

void on_mouse( int event, int x, int y, int flags, void* param )

//鼠标回调函数,该函数用鼠标进行跟踪目标的选择

{

if( !image )

return;

if( image->origin )

y = image->height - y;

//如果图像原点坐标在左下,则将其改为左上

if( select_object )

//select_object为,表示在用鼠标进行目标选择

//此时对矩形类selection用当前的鼠标位置进行设置

{

selection.x = MIN(x,origin.x);

selection.y = MIN(y,origin.y);

selection.width = selection.x + CV_IABS(x - origin.x);

selection.height = selection.y + CV_IABS(y - origin.y);

selection.x = MAX( selection.x, 0 );

selection.y = MAX( selection.y, 0 );

selection.width = MIN( selection.width, image->width );

selection.height = MIN( selection.height, image->height );

selection.width -= selection.x;

selection.height -= selection.y;

}

switch( event )

{

case CV_EVENT_LBUTTONDOWN:

//鼠标按下,开始点击选择跟踪物体

origin = cvPoint(x,y);

selection = cvRect(x,y,0,0);

select_object = 1;

break;

case CV_EVENT_LBUTTONUP:

//鼠标松开,完成选择跟踪物体

select_object = 0;

if( selection.width > 0 && selection.height > 0 )

//如果选择物体有效,则打开跟踪功能

track_object = -1;

break;

}

}

CvScalar hsv2rgb( float hue )

//用于将Hue量转换成RGB量

{

int rgb[3], p, sector;

static const int sector_data[][3]=

{{0,2,1}, {1,2,0}, {1,0,2}, {2,0,1}, {2,1,0}, {0,1,2}};

hue *= 0.033333333333333333333333333333333f;

sector = cvFloor(hue);

p = cvRound(255*(hue - sector));

p ^= sector & 1 ? 255 : 0;

rgb[sector_data[sector][0]] = 255;

rgb[sector_data[sector][1]] = 0;

rgb[sector_data[sector][2]] = p;

return cvScalar(rgb[2], rgb[1], rgb[0],0);

}

int main( int argc, char** argv )

{

CvCapture* capture = 0;

if( argc == 1 || (argc == 2 && strlen(argv[1]) == 1 && isdigit(argv[1][0]))) //打开摄像头

capture = cvCaptureFromCAM( argc == 2 ? argv[1][0] - '0' : 0 );

else if( argc == 2 )

//打开avi

capture = cvCaptureFromA VI( argv[1] );

if( !capture )

//打开视频流失败

{

fprintf(stderr,"Could not initialize capturing...\n");

return -1;

}

printf( "Hot keys: \n"

"\tESC - quit the program\n"

"\tc - stop the tracking\n"

"\tb - switch to/from backprojection view\n"

"\th - show/hide object histogram\n"

"To initialize tracking, select the object with mouse\n" );

//打印程序功能列表

cvNamedWindow( "Histogram", 1 );

//用于显示直方图

cvNamedWindow( "MeanShiftDemo", 1 );

//用于显示视频

cvSetMouseCallback( "MeanShiftDemo", on_mouse, 0 );

//设置鼠标回调函数

cvCreateTrackbar( "Vmin", "MeanShiftDemo", &vmin, 256, 0 ); cvCreateTrackbar( "Vmax", "MeanShiftDemo", &vmax, 256, 0 ); cvCreateTrackbar( "Smin", "MeanShiftDemo", &smin, 256, 0 );

//设置滑动条

for(;;)

//进入视频帧处理主循环

{

IplImage* frame = 0;

int i, bin_w, c;

frame = cvQueryFrame( capture ); //读取一帧图像

if( !frame )

break;

if( !image )

//image为,表明刚开始还未对image操作过,先建立一些缓冲区{

image = cvCreateImage( cvGetSize(frame), 8, 3 );

image->origin = frame->origin;

hsv = cvCreateImage( cvGetSize(frame), 8, 3 );

hue = cvCreateImage( cvGetSize(frame), 8, 1 );

mask = cvCreateImage( cvGetSize(frame), 8, 1 );

//分配掩膜图像空间

backproject = cvCreateImage( cvGetSize(frame), 8, 1 );

//分配反向投影图空间,大小一样,单通道

hist = cvCreateHist( 1, &hdims, CV_HIST_ARRAY, &hranges, 1 );

//分配直方图空间

histimg = cvCreateImage( cvSize(320,200), 8, 3 );

//分配用于直方图显示的空间

cvZero( histimg );

//置背景为黑色

}

cvCopy( frame, image, 0 );

cvCvtColor( image, hsv, CV_BGR2HSV );

//把图像从RGB表色系转为HSV表色系

if( track_object )

//track_object非零,表示有需要跟踪的物体

{

int _vmin = vmin, _vmax = vmax;

cvInRangeS( hsv, cvScalar(0,smin,MIN(_vmin,_vmax),0),

cvScalar(180,256,MAX(_vmin,_vmax),0), mask );

//制作掩膜板,只处理像素值为H:~180,S:smin~256,V:vmin~vmax之间的部分cvSplit( hsv, hue, 0, 0, 0 );

//分离H分量

if( track_object < 0 )

//如果需要跟踪的物体还没有进行属性提取,则进行选取框类的图像属性提取

{

float max_val = 0.f;

cvSetImageROI( hue, selection );

//设置原选择框为ROI

cvSetImageROI( mask, selection );

//设置掩膜板选择框为ROI

cvCalcHist( &hue, hist, 0, mask );

//得到选择框内且满足掩膜板内的直方图

cvGetMinMaxHistValue( hist, 0, &max_val, 0, 0 );

cvConvertScale( hist->bins, hist->bins, max_val ? 255. / max_val : 0., 0 );

// 对直方图的数值转为~255

cvResetImageROI( hue );

//去除ROI

cvResetImageROI( mask );

//去除ROI

track_window = selection;

track_object = 1;

//置track_object为,表明属性提取完成

cvZero( histimg );

bin_w = histimg->width / hdims;

for( i = 0; i < hdims; i++ )

//画直方图到图像空间

{

int val = cvRound( cvGetReal1D(hist->bins,i)*histimg->height/255 );

CvScalar color = hsv2rgb(i*180.f/hdims);

cvRectangle( histimg, cvPoint(i*bin_w,histimg->height),

cvPoint((i+1)*bin_w,histimg->height - val),

color, -1, 8, 0 );

}

}

cvCalcBackProject( &hue, backproject, hist );

//计算hue的反向投影图

cvAnd( backproject, mask, backproject, 0 );

//得到掩膜内的反向投影

//cvCamShift( backproject, track_window,

// cvTermCriteria( CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 10, 1 ),

// &track_comp, &track_box );

cvmeanshift( backproject, track_window,

cvTermCriteria( CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 10, 1 ),

&track_comp );

//使用MeanShift算法对backproject中的内容进行搜索,返回跟踪结果

track_window = track_comp.rect;

//得到跟踪结果的矩形框

if( backproject_mode )

cvCvtColor( backproject, image, CV_GRAY2BGR );

if( image->origin )

track_box.angle = -track_box.angle;

//cvEllipseBox( image, track_box, CV_RGB(255,0,0), 3, CV_AA, 0 );

//画出跟踪结果的位置

cvRectangle(image, cvPoint(track_comp.rect.x , track_comp.rect.y),

cvPoint(track_comp.rect.x+track_comp.rect.width , track_comp.rect.y+track_comp.rect.height) , CV_RGB(255,0,0), 1, CV_AA, 0);

}

if( select_object && selection.width > 0 && selection.height > 0 )

//如果正处于物体选择,画出选择框

{

cvSetImageROI( image, selection );

cvXorS( image, cvScalarAll(255), image, 0 );

cvResetImageROI( image );

}

cvShowImage( "MeanShiftDemo", image );

cvShowImage( "Histogram", histimg );

c = cvWaitKey(100);

if( (char) c == 27 )

break;

switch( (char) c )

//按键切换功能

{

case'b':

backproject_mode ^= 1;

break;

case'c':

track_object = 0;

cvZero( histimg );

break;

case'h':

show_hist ^= 1;

if( !show_hist )

cvDestroyWindow( "Histogram" );

else

cvNamedWindow( "Histogram", 1 );

break;

default:

;

}

}

cvReleaseCapture( &capture );

cvDestroyWindow("MeanShiftDemo");

return 0;

}

#ifdef _EiC

main(1,"camshiftdemo.c");

#endif

3 实验总结

meanshift算法在跟踪中的优势:

1 算法计算量较小,在目标区域已知的情况下完全可以做到实时跟踪

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

3 对于慢速运动物体,同时色调与背景有很好区分度时,跟踪效果很好

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

1 缺乏必要的模板更新;

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

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

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

5 不能跟踪与背景颜色类似的物体

传统meanshift跟踪算法流程

传统meanshift 跟踪算法实现流程 一、 Meanshift 算法流程图 视频流 手动选定跟踪目标 提取目标灰度加权直方图特征hist1 提取候选目 标区域 提取候选目标的灰度加权直方图特征hist2 均值漂移得到均值漂移向量及新的候选区域位 置 是否满足迭代结束条件 第二帧之后图像 第一帧图像 得到当前帧目标位置 是 否 图1 meanshift 流程图 二、 各模块概述 1、 手动选定目标区域:手动框出目标区域,并把该区域提取出来作为目标模板 区域; 2、 提取目标灰度加权直方图特征hist1; 2.1构造距离权值矩阵m_wei ; 使用Epanechnikov 核函数构造距离加权直方图矩阵:设目标区域中像素

点(,)i j 到该区域中心的距离为dist ,则 _(,)1/m wei i j dist h =-,这里h 是核函数窗宽,h 为目标区域中离区域中心 最远的像素点到中心的距离:若所选目标区域为矩形区域,区域的半宽度为 x h ,半高度为y h ,则22()x y h sqrt h h =+; 2.2得到归一化系数C ; 1/C M =,其中M 是m_wei 中所有元素值之和; 2.3计算目标的加权直方图特征向量hist1; 若图像为彩色图像,则把图像的,,r g b 分量归一化到[0,15]之间(分量值与16取余,余数即为归化后的分量值),然后为不同的分量值赋予不同的权值得到每个像素点的特征值_q temp : _256*16*q t e m p r g b = ++ 对于像素点(,)i j ,设其特征值为_q temp ,则另 1(_1)1(_1)_(,)hist q temp hist q temp m wei i j +=++; 若图像是灰度图像,则直接利用每个像素的灰度值作为每个像素的特征值,然后统计得到hist1; 把一维数组hist1归一化:11*hist hist C =;归一化后的数组hist1即为目标的加权直方图特征向量; 3、 从第二帧开始的图像,通过迭代的方式找到该帧图像中目标的位置; 3.1提取候选目标区域:以上一帧图像中目标的位置或上一次迭代得到的目标位置为中心提取出目标模板区域大小的区域; 3.2提取候选目标区域的加权直方图特征向量hist2:提取方法同步骤2.3; 计算候选目标区域的特征值矩阵_1q temp : _1 (,)256*(,) 16*(,)q t e m p i j r i j g i j b i j =++; 3.3均值漂移到新的目标区域; 3.3.1计算候选目标区域相对于目标区域的均值漂移权值w : ( 1()/2()),2(2w s q r t h i s t i h i s t i h i s t =≠ 2() 0h i s t i =时,()0;w i = 3.3.2 根据每个像素点所占的均值漂移权值计算漂移矩阵xw : 11(_1(,)1)*[(1),(2)]a b i j xw xw w q temp i j i y j y ===++--∑∑ 3.3.2得到权值归一化后的均值漂移向量Y :

多目标跟踪

多目标跟踪的基本理论 所谓多目标跟踪,就是为了维持对多个目标当前状态的估计而对所接收到的量测信息进行处理的过程。 目标模型不确定性 是指目标在未知的时间段内可能作己知的或未知的机动。一般情况下,目标的 非机动方式及目标发生机动时的不同的机动形式都可以通过不同的数学模型来加 以描述。在进行目标跟踪过程中,采用不正确的目标运动模型会导致跟踪系统跟踪 性能的严重下降。因而在目标跟踪过程中,运动模型采用的正确与否对目标的跟踪 性能是至关重要的。 观测不确定性 是指由传感器系统提供的量测数据可能是外部的干扰数据,它有可能是由杂波、虚警和相邻的目标所引起的,也可能是由被跟踪目标的对抗系统所主动发出来的虚假信息。这种不确定性在本质上显然是离散的,给目标跟踪问题提出了极大的挑战,相应地也就产生了数据关联的问题。 数据关联 数据关联的作用主要有:航迹保持、航迹建立和航迹终结。 数据关联算法主要有:“最近邻”方法,“全邻”最优滤波器方法、概率数据关联滤波器方法、多模型方法、相互作用多模型一概率数据关联滤波器方法、联合概率数据关联滤波器方法、多假设方法、航迹分裂方法。 1.“最近邻”方法的思想是:在落入跟踪波门中的所有量测中,离目标跟踪预测位置最近的量测认为是有效量测。“最近邻”方法的好处是算法最简单,但是精度差,抗杂波干扰的能力差。“最近邻”方法因为简单,算法易实现,因此也是目前广泛采用的一种数据关联算法. 2 .“全邻”最优滤波器 Singer,Sea和Housewright发展了一类“全邻”滤波器,这种滤波器不仅考虑了所有候选回波(空间累积信息),而且考虑了跟踪历史,即多扫描相关(时间累积信息)假定多余回波互不相关并且均匀分布于跟踪门内,则任何跟踪门的体积V内多余回波的数目Cx服从均值为βV的泊松分布。假定在K-1时刻,轨迹a′正确的概率为Pa(k-1)。关键问题是计算k时刻轨迹的正确概率Pa(k)。

目标跟踪算法

clc; clear; x=[0 16 25 33 50 65 75 82 100]; y=[0 172.5 227.5 324.2 330.7 286.1 237.7 201.7 0]; plot(xx,yy); 的图为 xx = 0:.01:100; yy = spline(x,y,xx); plot(xx,yy)

Matlab画平滑曲线的两种方法(拟合或插值后再用plot即可) 分类:MATLAB2012-12-02 11:15 25540人阅读评论(4) 收藏举报自然状态下,用plot画的是折线,而不是平滑曲线。 有两种方法可以画平滑曲线,第一种是拟合的方法,第二种是用spcrv,其实原理应该都一样就是插值。下面是源程序,大家可以根据需要自行选择,更改拟合的参数。 clc,clear; a = 1:1:6; %横坐标 b = [8.0 9.0 10.0 15.0 35.0 40.0]; %纵坐标

plot(a, b, 'b'); %自然状态的画图效果 hold on; %第一种,画平滑曲线的方法 c = polyfit(a, b, 2); %进行拟合,c为2次拟合后的系数 d = polyval(c, a, 1); %拟合后,每一个横坐标对应的值即为d plot(a, d, 'r'); %拟合后的曲线 plot(a, b, '*'); %将每个点用*画出来 hold on; %第二种,画平滑曲线的方法 values = spcrv([[a(1) a a(end)];[b(1) b b(end)]],3); plot(values(1,:),values(2,:), 'g');

基于meanshift的目标跟踪算法——完整版

基于Mean Shift的目标跟踪算法研究 指导教师:

摘要:该文把Itti视觉注意力模型融入到Mean Shift跟踪方法,提出了一种基于视觉显著图的Mean Shift跟踪方法。首先利用Itti视觉注意力模型,提取多种特征,得到显著图,在此基础上建立目标模型的直方图,然后运用Mean Shift方法进行跟踪。实验证明,该方法可适用于复杂背景目标的跟踪,跟踪结果稳定。 关键词:显著图目标跟踪Mean Shift Mean Shift Tracking Based on Saliency Map Abstract:In this paper, an improved Mean Shift tracking algorithm based on saliency map is proposed. Firstly, Itti visual attention model is used to extract multiple features, then to generate a saliency map,The histogram of the target based on the saliency map, can have a better description of objectives, and then use Mean Shift algorithm to tracking. Experimental results show that improved Mean Shift algorithm is able to be applied in complex background to tracking target and tracking results are stability. 1 引言 Mean Shift方法采用核概率密度来描述目标的特征,然后利用Mean Shift搜寻目标位置。这种方法具有很高的稳定行,能够适应目标的形状、大小的连续变化,而且计算速度很快,抗干扰能力强,能够保证系统的实时性和稳定性[1]。近年来在目标跟踪领域得到了广泛应用[2-3]。但是,核函数直方图对目标特征的描述比较弱,在目标周围存在与目标颜色分布相似的物体时,跟踪算法容易跟丢目标。目前对目标特征描述的改进只限于选择单一的特征,如文献[4]通过选择跟踪区域中表示目标主要特征的Harris点建立目标模型;文献[5]将初始帧的目标模型和前一帧的模型即两者的直方图分布都考虑进来,建立混合模型;文献[6]提出了以代表图像的梯度方向信息的方向直方图为目标模型;文献[7-8]提出二阶直方图,是对颜色直方图一种改进,是以颜色直方图为基础,颜色直方图只包含了颜色分布信息,二阶直方图在包含颜色信息的前提下包含了像素的均值向量和协方差。文献[9]提出目标中心加权距离,为离目标中心近的点赋予较大的权值,离目标中心远的点赋予较小的权值。文献[4-9]都是关注于目标和目标的某一种特征。但是使用单一特征的目标模型不能适应光线及背景的变化,而且当有遮挡和相似物体靠近时,容易丢失目标;若只是考虑改进目标模型,不考虑减弱背景的干扰,得到的效果毕竟是有限的。 针对上述问题,文本结合Itti 提出的视觉注意模型[5],将自底向上的视觉注意机制引入到Mean Shift跟踪中,提出了基于视觉显著图的Mean Shift跟踪方法。此方法在显著图基础上建立目标模型,由此得到的目标模型是用多种特征来描述的,同时可以降低背景对目标的干扰。 2 基于视觉显著图的Mean Shift跟踪方法

目标跟踪算法的分类

运动目标跟踪就是在一段序列图像中的每幅图像中实时地找到所感兴趣的运动目标 (包括位置、速度及加速度等运动参数)。在运动目标跟踪问题的研究上,总体来说有两种思路: a)不依赖于先验知识,直接从图像序列中检测到运动目标,并进行目标识别,最终跟踪感兴趣的运动目标; b)依赖于目标的先验知识,首先为运动目标建模,然后在图像序列中实时找到相匹配的运动目标。 一、运动目标检测 对于不依赖先验知识的目标跟踪来讲,运动检测是实现跟踪的第一步。运动检测即为从序列图像中将变化区域从背景图像中提取出来。运动目标检测的算法依照目标与摄像机之间的关系可以分为静态背景下运动检测和动态背景下运动检测。 静态背景下运动检测就是摄像机在整个监视过程中不发生移动,只有被监视目标在摄像机视场内运动,这个过程只有目标相对于摄像机的运动;动态背景下运动检测就是摄像机在整个监视过程中发生了移动 (如平动、旋转或多自由度运动),被监视目标在摄像机视场内也发生了运动,这个过程就产生了目标与摄像机之间复杂的相对运动。 1、静态背景 背景差分法 背景差分法是利用当前图像与背景图像的差分来检测运动区域的一种技术。它一般能够提供最完全的特征数据,但对于动态场景的变化,如天气、光照、背景扰动及背景物移入移出等特别敏感,运动目标的阴影也会影响检测结果的准确性及跟踪的精确性。其基本思想就是首先获得一个背景模型,然后将当前帧与背景模型相减,如果像素差值大于某一阈值,则判断此像素属于运动目标,否则属于背景图像。背景模型的建立与更新、阴影的去除等对跟踪结果的好坏至关重要。 帧间差分法 相邻帧间差分法是通过相邻两帧图像的差值计算,获得运动物体位置和形状等信息的运动目标检测方法。其对环境的适应性较强,特别是对于光照的变化适应性强,但由于运动目标上像素的纹理、灰度等信息比较相近,不能检测出完整

TLD目标跟踪算法

TLD目标跟踪算法 一、算法的背景 TLD(Tracking-Learning-Detection)是英国萨里大学的一个捷克籍博士生Zdenek 出的一种新的单目标长时间(long term tracking)跟踪算法。该算法与传统跟踪算法的显著区别在于将传统的跟踪算法和传统的检测算法相结合来解决被跟踪目标在被跟踪过程中发生的形变、部分遮挡等问题。同时,通过一种改进的在线学习机制不断更新跟踪模块的“显著特征点”和检测模块的目标模型及相关参数,从而使得跟踪效果更加稳定、鲁棒、可靠。 对于长时间跟踪而言,一个关键的问题是:当目标重新出现在相机视野中时,系统应该能重新检测到它,并开始重新跟踪。但是,长时间跟踪过程中,被跟踪目标将不可避免的发生形状变化、光照条件变化、尺度变化、遮挡等情况。传统的跟踪算法,前端需要跟检测模块相互配合,当检测到被跟踪目标之后,就开始进入跟踪模块,而此后,检测模块就不会介入到跟踪过程中。但这种方法有一个致命的缺陷:即,当被跟踪目标存在形状变化或遮挡时,跟踪就很容易失败;因此,对于长时间跟踪,或者被跟踪目标存在形状变化情况下的跟踪,很多人采用检测的方法来代替跟踪。该方法虽然在某些情况下可以改进跟踪效果,但它需要一个离线的学习过程。即:在检测之前,需要挑选大量的被跟踪目标的样本来进行学习和训练。这也就意味着,训练样本要涵盖被跟踪目标可能发生的各种形变和各种尺度、姿态变化和光照变化的情况。换言之,利用检测的方法来达到长时间跟踪的目的,对于训练样本的选择至关重要,否则,跟踪的鲁棒性就难以保证。 考虑到单纯的跟踪或者单纯的检测算法都无法在长时间跟踪过程中达到理想的效果,所以,TLD方法就考虑将两者予以结合,并加入一种改进的在线学习机制,从而使得整体的目标跟踪更加稳定、有效。 简单来说,TLD算法由三部分组成:跟踪模块、检测模块、学习模块;如下图所示 其运行机制为:检测模块和跟踪模块互补干涉的并行进行处理。首先,跟踪模块假设相邻视频帧之间物体的运动是有限的,且被跟踪目标是可见的,以此来估计目标的运动。 如果目标在相机视野中消失,将造成跟踪失败。检测模块假设每一个视帧都是彼此独立的,并且根据以往检测和学习到的目标模型,对每一帧图片进行全图搜索以定位目标可能出现的区域。同其它目标检测方法一样,TLD中的检测模块也有可能出现错误,且错误无非是错误的负样例和错误的正样例这两种情况。而学习模块则根据跟踪模块的结果对检测模块的这两种错误进行评估,并根据评估结果生成训练样本对检测模块的目标模型进行更新,同时对跟踪模块的“关键特征点”进行更新,以此来避免以后出现类似的

目标跟踪算法的分类

目标跟踪算法的分类

主要基于两种思路: a)不依赖于先验知识,直接从图像序列中检测到运动目标,并进行目标识别,最终跟踪感兴趣的运动目标; b)依赖于目标的先验知识,首先为运动目标建模,然后在图像序列中实时找到相匹配的运动目标。 一.运动目标检测 对于不依赖先验知识的目标跟踪来讲,运动检测是实现跟踪的第一步。运动检测即为从序列图像中将变化区域从背景图像中提取出来。运动目标检测的算法依照目标与摄像机之间的关系可以分为静态背景下运动检测和动态背景下运动检测 (一)静态背景 1.背景差 2.帧差 3.GMM 4.光流 背景减算法可以对背景的光照变化、噪声干扰以及周期性运动等进行建模,在各种不同情况下它都可以准确地检测出运动目标。因此对于固定

个关键技术: a)匹配法则,如最大相关、最小误差等 b)搜索方法,如三步搜索法、交叉搜索法等。 c) 块大小的确定,如分级、自适应等。 光流法 光流估计的方法都是基于以下假设:图像灰度分布的变化完全是目标或者场景的运动引起的,也就是说,目标与场景的灰度不随时间变化。这使得光流方法抗噪声能力较差,其应用范围一般局限于目标与场景的灰度保持不变这个假设条件下。另外,大多数的光流计算方法相当复杂,如果没有特别的硬件装置,其处理速度相当慢,达不到实时处理的要求。 二.目标跟踪 运动目标的跟踪,即通过目标的有效表达,在图像序列中寻找与目标模板最相似候选目标区位置的过程。简单说,就是在序列图像中为目标定位。运动目标的有效表达除了对运动目标建模外,目标跟踪中常用到的目标特性表达主要包括视觉特征 (图像边缘、轮廓、形状、纹理、区域)、统计特征 (直方图、各种矩特征)、变换系数特

视频目标跟踪算法综述_蔡荣太

1引言 目标跟踪可分为主动跟踪和被动跟踪。视频目标跟踪属于被动跟踪。与无线电跟踪测量相比,视频目标跟踪测量具有精度高、隐蔽性好和直观性强的优点。这些优点使得视频目标跟踪测量在靶场光电测量、天文观测设备、武器控制系统、激光通信系统、交通监控、场景分析、人群分析、行人计数、步态识别、动作识别等领域得到了广泛的应用[1-2]。 根据被跟踪目标信息使用情况的不同,可将视觉跟踪算法分为基于对比度分析的目标跟踪、基于匹配的目标跟踪和基于运动检测的目标跟踪。基于对比度分析的跟踪算法主要利用目标和背景的对比度差异,实现目标的检测和跟踪。基于匹配的跟踪主要通过前后帧之间的特征匹配实现目标的定位。基于运动检测的跟踪主要根据目标运动和背景运动之间的差异实现目标的检测和跟踪。前两类方法都是对单帧图像进行处理,基于匹配的跟踪方法需要在帧与帧之间传递目标信息,对比度跟踪不需要在帧与帧之间传递目标信息。基于运动检测的跟踪需要对多帧图像进行处理。除此之外,还有一些算法不易归类到以上3类,如工程中的弹转机跟踪算法、多目标跟踪算法或其他一些综合算法。2基于对比度分析的目标跟踪算法基于对比度分析的目标跟踪算法利用目标与背景在对比度上的差异来提取、识别和跟踪目标。这类算法按照跟踪参考点的不同可以分为边缘跟踪、形心跟踪和质心跟踪等。这类算法不适合复杂背景中的目标跟踪,但在空中背景下的目标跟踪中非常有效。边缘跟踪的优点是脱靶量计算简单、响应快,在某些场合(如要求跟踪目标的左上角或右下角等)有其独到之处。缺点是跟踪点易受干扰,跟踪随机误差大。重心跟踪算法计算简便,精度较高,但容易受到目标的剧烈运动或目标被遮挡的影响。重心的计算不需要清楚的轮廓,在均匀背景下可以对整个跟踪窗口进行计算,不影响测量精度。重心跟踪特别适合背景均匀、对比度小的弱小目标跟踪等一些特殊场合。图像二值化之后,按重心公式计算出的是目标图像的形心。一般来说形心与重心略有差别[1-2]。 3基于匹配的目标跟踪算法 3.1特征匹配 特征是目标可区别与其他事物的属性,具有可区分性、可靠性、独立性和稀疏性。基于匹配的目标跟踪算法需要提取目标的特征,并在每一帧中寻找该特征。寻找的 文章编号:1002-8692(2010)12-0135-04 视频目标跟踪算法综述* 蔡荣太1,吴元昊2,王明佳2,吴庆祥1 (1.福建师范大学物理与光电信息科技学院,福建福州350108; 2.中国科学院长春光学精密机械与物理研究所,吉林长春130033) 【摘要】介绍了视频目标跟踪算法及其研究进展,包括基于对比度分析的目标跟踪算法、基于匹配的目标跟踪算法和基于运动检测的目标跟踪算法。重点分析了目标跟踪中特征匹配、贝叶斯滤波、概率图模型和核方法的主要内容及最新进展。此外,还介绍了多特征跟踪、利用上下文信息的目标跟踪和多目标跟踪算法及其进展。 【关键词】目标跟踪;特征匹配;贝叶斯滤波;概率图模型;均值漂移;粒子滤波 【中图分类号】TP391.41;TN911.73【文献标识码】A Survey of Visual Object Tracking Algorithms CAI Rong-tai1,WU Yuan-hao2,WANG Ming-jia2,WU Qing-xiang1 (1.School of Physics,Optics,Electronic Science and Technology,Fujian Normal University,Fuzhou350108,China; 2.Changchun Institute of Optics,Fine Mechanics and Physics,Chinese Academy of Science,Changchun130033,China)【Abstract】The field of visual object tracking algorithms are introduced,including visual tracking based on contrast analysis,visual tracking based on feature matching and visual tracking based on moving detection.Feature matching,Bayesian filtering,probabilistic graphical models,kernel tracking and their recent developments are analyzed.The development of multiple cues based tracking,contexts based tracking and multi-target tracking are also discussed. 【Key words】visual tracking;feature matching;Bayesian filtering;probabilistic graphical models;mean shift;particle filter ·论文·*国家“863”计划项目(2006AA703405F);福建省自然科学基金项目(2009J05141);福建省教育厅科技计划项目(JA09040)

目标跟踪的研究背景意义方法及现状

目标跟踪的研究背景意义方法及现状

目录 ? 1.课题背景与研究意义? 2.国内外研究现状 ? 3.存在的问题 ? 4.总结,发展与展望 ? 5.参考文献

1课题背景与研究意义 ?运动目标的跟踪就是在视频图像的每一幅图像中确定出我们感兴趣的运动目标的位置,并把不同帧中同一目标对应起来。 ?智能视频监控(IVS: Intelligent Video Surveillance)是计算机视觉领域近几年来发展较快,研究较多的一个应用方向。它能够利用计算机视觉技术对采集到的视频信号进行处理、分析和理解,并以此为基础对视频监控系统进行控制,从而使视频监控系统具备更好的智能性和鲁棒性。智能视频监控系统主要涉及到图像处理、计算机视觉、模式识别、人工智能等方面的科学知识,它的用途非常广泛,在民用和军事领域中都有着极大的应用前景。

2.国内外研究现状 视频目标跟踪算法 基于对比度分析基于匹配核方法运动检测其它方法 特征匹配贝叶斯 跟踪 Mean shift方法 光流法

基于对比度分析的方法 ?算法思想:基于对比度分析的目标跟踪算法利用目标与背景在对比度上的差异来提取、识别和跟踪目标。 ?分类:边缘跟踪,型心跟踪,质心跟踪。 ?优缺点:不适合复杂背景中的目标跟踪,但在空中背景下的目标跟踪中非常有效。

基于特征匹配的目标跟踪算法 ?算法思想:基于匹配的目标跟踪算法需要提取目标的特征,并在每一帧中寻找该特征。寻找的过程就是特征匹配过 程。 ?目标跟踪中用到的特征主要有几何形状、子空间特征、外形轮廓和特征点等。其中,特征点是匹配算法中常用的特征。特征点的提取算法很多,如Kanade Lucas Tomasi (KLT)算法、Harris 算法、SIFT 算法以及SURF 算法等。?优缺点:特征点一般是稀疏的,携带的信息较少,可以通过集成前几帧的信息进行补偿。目标在运动过程中,其特征(如姿态、几何形状、灰度或颜色分布等)也随之变化。 目标特征的变化具有随机性,这种随机变化可以采用统计数学的方法来描述。直方图是图像处理中天然的统计量,因此彩色和边缘方向直方图在跟踪算法中被广泛采用。

多目标跟踪算法

多目标跟踪算法 先来回顾下卡尔曼滤波器: 假定k k x |表示当前k 时刻目标的状态,k 1k x |+表示下一个时刻目标的状态,k z 则表示k 时刻的实际观测。一般地模型都假定为线性的: 这里的1k x +为k+1时刻目标的状态,k x 为k 时刻的状态,为状态转移矩阵,而是服从均值为0方差为的正态分布,表示由噪声等引起的干扰。卡尔曼滤波采取初步估 计: 这里的估计只是初步的估计,状态估计与实际状态的误差矩阵等于状态1k x +的的方差,即: 更新(修正): 这里已知了实际观察,同样是假定观测与状态的似然关系是线性的,即满足: 服从一个均值为0方差为 的正态分布。 卡尔曼滤波器给出了经过更新后得到的比较合理的k+1时刻的估计为: 相应地得到了更新后方差的估计: 这里: 其实这些都是通过最小二乘法推出来的,即使得误差: 最小,而初步估计也是通过最小二乘法获得,即使得: 最小。有了上述估计方程后,便可以获得一个估计流程:

下面再介绍下贝叶斯公式 先看一个定义 马氏链: 设{} ,,,k j i E =为有限集或可列集,称()0n n X ≥为定义在概率空间()P F,,Ω上,取值于空间E 的马氏链,如果满足下面的马氏性:对一切n 10i i i ,,, 有 [][]1n 1n n n 1n 1n 00n n i X i X P i X i X i X P ----======|,,| 若左边的条件概率有定义,则称[]i X j X P 1n n ==-|为在n-1时刻状态为i,在n 时刻在j 的转移概率函数,若它与n 无关,则记为ij p ,并称为时齐的或齐次的。显然这里的马氏性接近于独立性,在一定程度上可以称为无记忆性或无后效性。 下面我们来推导贝叶斯公式: 容易由条件概率公式定义知 而 ()()()()()()( ) ()() ()( ) ()() ( )() ()()() 1 k 1 k 1k k k 1 k k 1k k k 1k k 1k k k 1k k k k k 1k 1k 1k k k 1k k k k k 1k 1k 1k k k 1k 1k 1k k k 1k 1k 1k 1k 1k z x f dx x f x z f x f x z f z f dx x f x z f x z f z f x f x z f x z f dx z x f x z f z x f x z f x f +++++++++++++++++++++++== ? == ?? ?||||||||||||||||||||||||| 就得到了更新后的公式如下: 这里记 于是就可以得到贝叶斯滤波器跟踪流程如下: 实际上可以证明,卡尔曼滤波器是贝叶斯滤波器的一种特殊形式,由于假定噪声服从正态分布,同样地观测与状态估计的误差也是服从正态分布,那么不难得:

MeanShift-图像分割方法

摘要 在图像处理和计算机视觉里,图像分割是一个十分基础而且很重要的部分,决定了最终分析结果的好坏。图像分割问题的典型定义就是如何在图像处理过程中将图像中的一致性区域和感兴趣对象提取出来。 MeanShift 图像分割方法是一种统计迭代的核密度估计方法。MeanShift算法以其简单有效而被广泛应用,但该方法在多特征组合方面和数据量较大的图像处理上仍存在不足之处,本文针对这些问题对该算法的结构进行了优化。本文利用图像上下文信息对图像进行了区域合并以此来对输入数据进行了压缩;并实现特征空间中所有特征量的优化组合。 最后,总结了本文的研究成果。下一步需要深入的研究工作有:(1)考虑分割的多尺度性,实现基于Mean Shift算法的多尺度遥感图像分割;(2)考虑利用Gabor滤波器来提取纹理特征,或将更多的特征如形状等特征用于MeanShift遥感图像分割中。 关键词: Mean Shift, 图像分割, 遥感图像, 带宽

ABSTRACT mage segmentation is very essential and critical to image processing and computer vision, which is one of the most difficult tasks in image processing, and determines the quality of the final result of analysis. In image segmentation problem, the typical goal is to extract continuous regions and interest objects in the case of image processing. The Mean Shift algorithm for segmentation is a statistical iterative algorithm based on kernel density estimation. Mean Shift algorithm has been widely applied for its simplicity and efficiency. But the algorithm has some deficiencies in feature combination and image processing for large data. According to the deficiencies of the Mean Shift algorithm, this paper optimizes the structure of the algorithm for segmentation. Firstly, this paper introduces a method of data compressing by merging the nearest points with similar properties into consistency regions. Secondly, We optimize the combination of features. At last, after concluding all research work in this paper, further work need to be in-depth studied: (1) Consider multi-scale factors of remote sensing, and realize multi-scale remote sensing image segmentation based on Mean Shift algorithm. (2) Consider extracting textures features by using Gabor filter, or use more features such as shape features to segment remote sensing images based on Mean Shift algorithm. KEY WORDS: Mean Shift, image segmentation, remote sensing images, bandwidth,

目标定位跟踪算法及仿真程序(修改后)

目标定位跟踪算法及仿真程序 质心算法是最简单的定位算法,如图2-1所示,四个小圆为观测站,实线三角形是目标真实的位置,假设四个圆形观测站都探测到目标的存在,则根据质心定位算法,目标的位置(x,y )可以表示为:4 4 321x x x x x +++= , 4 4 321y y y y y +++= ,这里观测站得位置为),(i i y x ,同理,当观测站数目为N 时,这时候的质心定位算法可以表示为: ???? ? ??? ????=??????∑ ∑ ==N i i N i i y N x N y x 1 1 11 图1 质心定位 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 质心定位算法Matlab 程序 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function main % 定位初始化 Length=100; % 场地空间,单位:米 Width=100; % 场地空间,单位:米 d=50; % 目标离观测站50米以内都能探测到,反之则不能 Node_number=6; % 观测站的个数 for i=1:Node_number % 观测站的位置初始化,这里位置是随机给定的 Node(i).x=Width*rand; Node(i).y=Length*rand; end % 目标的真实位置,这里也随机给定 Target.x=Width*rand; Target.y=Length*rand; % 观测站探测目标 X=[]; for i=1:Node_number

MeanShift算法

核函数也称“窗口函数”。一维空间用到的核函数有高斯(Gaussian)、余弦弧(Cosinus arch)、双指数(Double Exponential)、均匀(Uniform)、三角(Trangle)、依潘涅契科夫(Epanechikov)、双依潘涅契科夫(DoubleEpanechnikov)、及双权(Biweight)函数。图2.1给出了最常用的几个核函数

给定一组一维空间的n个数据点集合令该数据集合 的概率密度函数假设为f (x),核函数取值为,那么在数据点x处的密度估计可以按下式计算: 上式就是核密度估计的定义。其中,x为核函数要处理的数据的中心点,即数据集合相对于点x几何图形对称。核密度估计的含义可以理解为:核估计器在被估计点为中心的窗口内计算数据点加权的局部平均。或者:将在每个采样点为中心的局部函数的平均效果作为该采样点概率密度函数的估计值。

MeanShift实现: 1.选择窗的大小和初始位置. 2.计算此时窗口内的Mass Center. 3.调整窗口的中心到Mass Center. 4.重复2和3,直到窗口中心"会聚",即每次窗口移动的距离小于一定的阈值,或者迭代次数达到设定值。 meanshift算法思想其实很简单:利用概率密度的梯度爬升来寻找局部最优。它要做的就是输入一个在图像的范围,然后一直迭代(朝着重心迭代)直到满足你的要求为止。但是他是怎么用于做图像跟踪的呢?这是我自从学习meanshift以来,一直的困惑。而且网上也没有合理的解释。经过这几天的思考,和对反向投影的理解使得我对它的原理有了大致的认识。 在opencv中,进行meanshift其实很简单,输入一张图像(imgProb),再输入一个开始迭代的方框(windowIn)和一个迭代条件(criteria),输出的是迭代完成的位置(comp )。 这是函数原型: int cvMeanShift( const void* imgProb, CvRect windowIn,CvTermCriteria criteria, CvConnectedComp* comp ) 但是当它用于跟踪时,这张输入的图像就必须是反向投影图了。 为什么必须是反向投影图呢?首先我们要理解什么是反向投影图。 简单理解它其实实际上是一张概率密度图。经过反向投影时的输入是一个目标图像的直方图(也可以认为是目标图像),还一个输入是当前图像就是你要跟踪的全图,输出大小与全图一样大,它上像素点表征着一种概率,就是全图上这个点是目标图像一部分的概率。如果这个点越亮,就说明这个点属于物体的概率越大。现在我们明白了这原来是一张概率图了。当用meanshift跟踪时,输入的原来是这样一幅图像,那也不难怪它可以进行跟踪了。 半自动跟踪思路:输入视频,用画笔圈出要跟踪的目标,然后对物体跟踪。用过opencv的都知道,这其实是camshiftdemo的工作过程。 第一步:选中物体,记录你输入的方框和物体。 第二步:求出视频中有关物体的反向投影图。

Matlab实例之MeanShift的跟踪算法程序

MeanShiftCluster.m %testDistCluters clear clc profile on nPtsPerClust = 250; nClust = 3; totalNumPts = nPtsPerClust*nClust; m(:,1) = [1 1]'; m(:,2) = [-1 -1]'; m(:,3) = [1 -1]'; var = .6; bandwidth = .75; clustMed = []; %clustCent; x = var*randn(2,nPtsPerClust*nClust); %*** build the point set for i = 1:nClust x(:,1+(i-1)*nPtsPerClust:(i)*nPtsPerClust) = x(:,1+(i- 1)*nPtsPerClust:(i)*nPtsPerClust) + repmat(m(:,i),1,nPtsPerClust); end tic [clustCent,point2cluster,clustMembsCell] = MeanShiftCluster(x,bandwidth); toc

numClust = length(clustMembsCell); figure(10),clf,hold on cVec = 'bgrcmykbgrcmykbgrcmykbgrcmyk';%, cVec = [cVec cVec]; for k = 1:min(numClust,length(cVec)) myMembers = clustMembsCell{k}; myClustCen = clustCent(:,k); plot(x(1,myMembers),x(2,myMembers),[cVec(k) '.']) plot(myClustCen(1),myClustCen(2),'o','MarkerEdgeColor','k','MarkerFaceColor',cVec(k ), 'MarkerSize',10) end title(['no shifting, numClust:' int2str(numClust)]) testMeanShift.m %testDistCluters clear clc profile on nPtsPerClust = 250; nClust = 3; totalNumPts = nPtsPerClust*nClust; m(:,1) = [1 1]'; m(:,2) = [-1 -1]'; m(:,3) = [1 -1]'; var = .6; bandwidth = .75;

多目标跟踪方法研究综述

经过近40多年的深入研究和发展,多目标跟踪技术在许多方面都有着广泛应用和发展前景,如军事视觉制导、机器人视觉导航、交通管 制、 医疗诊断等[1-2]。目前,虽然基于视频的多运动目标跟踪技术已取得了很大的成就,但由于视频中图像的变化和物体运动的复杂性,使得对多运动目标的检测与跟踪变得异常困难,如多目标在运动过程中互遮挡、监控场景的复杂性等问题,解决上述难题一直是该领域所面临的一个巨大挑战,因此,对视频中多目标跟踪技术研究仍然是近年来一个热门的研究课题[3-5]。 1、多目标跟踪的一般步骤 基于视频的多目标跟踪技术融合了图像处理、模式识别、人工智能、 自动控制以及计算机视觉等众多领域中的先进技术和核心思想。不同的多目标跟踪方法其实现步骤有一定的差异,但多目标跟踪的主要 流程是相同的,如图1所示,其主要包括图像预处理、 运动目标检测、多目标标记与分离、多目标跟踪四个步骤。 图1多目标跟踪基本流程图 2、多目标跟踪方法 多目标跟踪方法可以根据处理图像或视频获取视点的多少分为两大类,一类是单视点的多目标跟踪,另一类就是多视点的多目标跟踪。 2.1单视点的方法 单视点方法是针对单一相机获取的图像进行多目标的检测和跟踪。该方法好处在于简单且易于开发,但由于有限的视觉信息的获取,很难处理几个目标被遮挡的情况。 块跟踪(Blob-tracking)是一种流行的低成本的跟踪方法[6-7]。这种方法需要首先在每一帧中提取块,然后逐帧寻找相关联的块,从而实现跟 踪。 例如BraMBLe系统[8]就是一个基于已知的背景模型和被跟踪的人的外表模型计算出块的似然性的多块跟踪器。这种方法最大的不足之处在于:当由于相似性或者遮挡,多个目标合并在一起时,跟踪将导致失败。因此,可以取而代之的方法是通过位置、外观和形状保留清晰目标的状态。文献[9]利用组合椭圆模拟人的形状,用颜色直方图模拟不同人的外观,用一个增强高斯分布模拟背景以便分割目标,一旦场景中发现对应于运动头部的像素,一个MCMC方法就被用于获取多个人的轮廓的最大后验概率,在单相机的多人跟踪应用中取得了非常有意义的结果。Okuma等人提出了一种将Adaboost算法和粒子滤波相结合的方法[10]。该方法由于充分利用了两种方法的优点,相比于单独使用这两种方法本身,大大降低了跟踪失败的情形,同时也解决了在同一框架下检测和一致跟踪的问题。Brostow等人提出了一个用于在人群中检测单个行人的特征点轨迹聚类的概率框架[11]。这个框架有一个基本假设是一起运动的点对可能是同一个个体的一部分,并且把它用于检测和最终的跟踪。对于完全和部分遮挡目标以及外观变化,这些方法和另外一些相似的方法都有很大的局限性。 为了解决遮挡问题,一系列单视点跟踪技术应运而生。典型的方法 是利用块合并来检测遮挡的发生[12]。当被跟踪的点消失, 跟踪特征点的方法就简单的将其作为一个被遮挡特征点。近年来,基于目标轮廓和外观的跟踪技术利用隐含的目标到相机的深度变化来表示和估计目标间的遮挡关系。但大多数方法都只能解决部分遮挡,不能解决完全被遮挡 的情况。 另外,小的一致运动被假设为是可以从遮挡视点中可以预测运动模式的,这些给没有预测运动的较长时间的遮挡的处理带来问题。尽管这些单视点的方法有较长的研究历史,但这些方法由于不能明锐的 观察目标的隐藏部分,因此不能很好地解决有2或3个目标的遮挡问题。 2.2多视点的方法 随着复杂环境中对检测和跟踪多个被遮挡的人和计算他们的精确 位置的需要,多视点的方法成为研究的热点。 多视点跟踪技术的目的就是利用不同视点的冗余信息,减少被遮挡的区域,并提供目标和场景的3D信息。尽管通过相机不能很好地解决目标跟踪问题,但却提出了一些很好的想法,如选择最佳视点,但这些方法都以实际环境模型和相机校正为特征。 90年代后半期,在很多文献中给出了多视点相关的多目标跟踪方法。 比如利用一个或多个相机与观察区域相连的状态变化映射,同时给出一系列的行为规则去整合不同相机间的信息。利用颜色在多个视点中进行多目标的跟踪的方法,该方法模拟了从基于颜色直方图技术的 背景提取中获得的连接块并应用其去匹配和跟踪目标。 除此之外,也有在原来的单视点跟踪系统进行扩展的多视点跟踪方法。该方法主要是通过一个预测,当预测当前的相机不在有一个好的视点时,跟踪就从原来凯斯的那个单相机视点的跟踪转换到另外一个相机,从而实现多视点的跟踪。基于点与它对应的极线的欧氏距离的空间匹配方法、贝叶斯网络和立体相对合并的方法都是多目标多视点跟踪的常见方法。尽管这些方法都试图去解决遮挡问题,但由于遮挡的存在,基于特征的方法都不能根本解决,其次,这些方法中的遮挡关系的推理一般都是根据运动模型,卡尔曼滤波或者更普遍的马尔科夫模型的时间一致性来进行的。因此,当这个过程开始发散,这些方法也不能恢复遮挡关系。 最近一种基于几何结构融合多个视点信息的Homegraphicoccupancyconsrraint(HOC)[12]方法,可以通过在多场景平台对人的定位来解决遮挡问题。仅采用随时间变化的外表信息用于从背景中检测前景,这使得在拥挤人流的场景中的外表遮挡的解决更健壮。利用多视点中的前景信息,主要是试图找到被人遮挡的场景点的图像位置,然后这些被遮挡的信息用于解决场景中多个人的的遮挡和跟踪问题。在这种思想指导下,Mittal,Leibe,Franco等的研究工作和机器人导航中基于遮挡网格的距离传感器的并行工作是相似的,这些方法在融合3D空间信息的时候需要进行校正相机。但HOC方法是完全基于图像的,仅需要2D结构信息进行图像平面的融合。当然也有另外一些不需要进行相机校正的算法被提出,但需要学习一个与相机最小相关的信息。在目标跟踪过程中,由于这些方法依赖于单个相机的场景,对于拥挤场景中目标分布密度增加九无能为力了。在HOC的多视点的目标跟踪中,对于任何单一相机的场景,或者相机对的场景,都不需要进行定位和跟踪目标,而是从所有相机的场景中收集证据,形成一个统一的框架,由于该方法能够从多个时间帧的场景中进行场景被遮挡概率的全局轨迹优化,因此可以同时进行检测和跟踪。 3、总结 动态目标检测与跟踪是智能监控系统的重要组成部分,它融合了图像处理、模式识别、自动控制及计算机应用等相关领域的先进技术和研究成果,是计算机视觉和图像编码研究领域的一个重要课题,在军事武器、工业监控、交通管理等领域都有广泛的应用。尤其是对于多目标检测与跟踪中的遮挡与被遮挡的处理,对提高智能监控中目标的行为分析有着重要的意义。随着监控设备的发展和设施的铺设,多视点的场景图像是很容易得到的,因此借助信息融合的思想,充分利用不同角度对目标的描述信息,可以很大地改进目前基于单视点的多目标检测和跟踪的精度,能够很好地解决单视点方法中不能很好解决的遮挡问题。参考文献 [1]胡斌,何克忠.计算机视觉在室外移动机器人中的应用.自动化学报,2006,32(5):774-784. [2]A.Ottlik,H.-H.Nagel.InitializationofModel-BasedVehicleTrackinginVideoSequencesofInner-CityIntersections.InternationalJournalofComputerVision,2008,80(2):211-225.多目标跟踪方法研究综述 苏州联讯图创软件有限责任公司 陈宁强 [摘要]文章对目前现有的多目标跟踪方法从信息获取的不同角度进行了综述。主要分析比较了目前单视点和多视点目标跟踪方 法对于目标遮挡问题的处理性能,并指出多视点的基于多源信息融合的思想,可以较好地解决场景中目标的遮挡问题。[关键词]单视点多视点目标跟踪信息融合基金项目:本文系江苏省自然科学基金(BK2009593)。 作者简介:陈宁强(1973-),男,江苏苏州人,工程师,主要研究方向:GIS、模式识别和图像处理与分析。 目标跟踪多目标标记与分离 匹配 目标模型 运动检测当前帧图像 背景提取 去噪 ROI 预处理 视频序列 (下转第26页)

相关主题