当前位置:首页 > 代码 > 正文

粒子滤波跟踪算法代码(相关滤波跟踪算法)

admin 发布:2022-12-19 22:08 131


今天给各位分享粒子滤波跟踪算法代码的知识,其中也会对相关滤波跟踪算法进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

谁有粒子滤波C++实现的代码

程序流程:

1.命令行参数处理 -

2.设置随机数生成器环境,创建随机数生成器、并且对其初始化。-

3.初始化视频句柄 -

4.取视频中的一帧进行处理 -

1)GRB-HSV

2)保存当前帧在frames

3) 判断是否为第一帧,

若是则,

(1)忙等用户选定欲跟踪的区域

(2)计算相关区域直方图

(3)得到跟踪粒子

若不是则,

(1)对每个粒子作变换,并计算每个粒子的权重

(2)对粒子集合进行归一化

(3)重新采样粒子

4)画出粒子所代表的区域

5.释放图像

OpenCV学习——物体跟踪的粒子滤波算法实现之命令行参数处理

void arg_parse( int argc, char** argv )

{

int i = 0;

pname = remove_path( argv[0] );

while( TRUE )

{

char* arg_check;

int arg = getopt( argc, argv, OPTIONS );

if( arg == -1 )

break;

switch( arg )

{

case 'h':

usage( pname );

exit(0);

break;

case 'a':

show_all = TRUE;

break;

case 'o':

export = TRUE;

break;

case 'p':

if( ! optarg )

fatal_error( "error parsing arguments at -%c\n" \

"Try '%s -h' for help.", arg, pname );

num_particles = strtol( optarg, arg_check, 10 );

if( arg_check == optarg || *arg_check != '\0' )

fatal_error( "-%c option requires an integer argument\n" \

"Try '%s -h' for help.", arg, pname );

break;

default:

fatal_error( "-%c: invalid option\nTry '%s -h' for help.",

optopt, pname );

}

}

if( argc - optind 1 )

fatal_error( "no input image specified.\nTry '%s -h' for help.", pname );

if( argc - optind 2 )

fatal_error( "too many arguments.\nTry '%s -h' for help.", pname );

vid_file = argv[optind];

}

作者使用Getopt这个系统函数对命令行进行解析,-h表示显示帮助,-a表示将所有粒子所代表的位置都显示出来,-o表示输出tracking的帧,-p number进行粒子数的设定,然后再最后指定要处理的视频文件。

OpenCV学习——物体跟踪的粒子滤波算法实现之RGB-HSV

IplImage* bgr2hsv( IplImage* bgr )

{

IplImage* bgr32f, * hsv;

bgr32f = cvCreateImage( cvGetSize(bgr), IPL_DEPTH_32F, 3 );

hsv = cvCreateImage( cvGetSize(bgr), IPL_DEPTH_32F, 3 );

cvConvertScale( bgr, bgr32f, 1.0 / 255.0, 0 );

cvCvtColor( bgr32f, hsv, CV_BGR2HSV );

cvReleaseImage( bgr32f );

return hsv;

}

程序现将图像的像素值归一化,然后使用OpenCV中的cvCvtcolor函数将图像从RGB空间转换到HSV空间。

OpenCV学习——物体跟踪的粒子滤波算法实现之设定随机数

gsl_rng_env_setup();//setup the enviorment of random number generator

rng = gsl_rng_alloc( gsl_rng_mt19937 );//create a random number generator

gsl_rng_set( rng, time(NULL) );//initializes the random number generator.

作者使用GSL库进行随机数的产生,GSL是GNU的科学计算库,其中手册中random部分所述进行随机数生成有三个步骤:

随机数生成器环境建立,随机数生成器的创建,随机数生成器的初始化。

OpenCV学习——物体跟踪的粒子滤波算法实现之计算选定区域直方图

histogram** compute_ref_histos( IplImage* frame, CvRect* regions, int n )

{

histogram** histos = malloc( n * sizeof( histogram* ) );

IplImage* tmp;

int i;

for( i = 0; i n; i++ )

{

cvSetImageROI( frame, regions[i] );//set the region of interest

tmp = cvCreateImage( cvGetSize( frame ), IPL_DEPTH_32F, 3 );

cvCopy( frame, tmp, NULL );

cvResetImageROI( frame );//free the ROI

histos[i] = calc_histogram( tmp, 1 );//calculate the hisrogram

normalize_histogram( histos[i] );//Normalizes a histogram so all bins sum to 1.0

cvReleaseImage( tmp );

}

return histos;

}

程序中先设置了一个类型为histogram的指向指针的指针,是histogram指针数组的指针,这个数组是多个选定区域的直方图数据存放的位置。然后对于每一个用户指定的区域,在第一帧中都进行了ROI区域设置,通过对ROI区域的设置取出选定区域,交给函数calc_histogram计算出直方图,并使用normalize_histogram对直方图进行归一化。

计算直方图的函数详解如下:

histogram* calc_histogram( IplImage** imgs, int n )

{

IplImage* img;

histogram* histo;

IplImage* h, * s, * v;

float* hist;

int i, r, c, bin;

histo = malloc( sizeof(histogram) );

histo-n = NH*NS + NV;

hist = histo-histo;

memset( hist, 0, histo-n * sizeof(float) );

for( i = 0; i n; i++ )

{

img = imgs[i];

h = cvCreateImage( cvGetSize(img), IPL_DEPTH_32F, 1 );

s = cvCreateImage( cvGetSize(img), IPL_DEPTH_32F, 1 );

v = cvCreateImage( cvGetSize(img), IPL_DEPTH_32F, 1 );

cvCvtPixToPlane( img, h, s, v, NULL );

for( r = 0; r img-height; r++ )

for( c = 0; c img-width; c++ )

{

bin = histo_bin( pixval32f( h, r, c ),

pixval32f( s, r, c ),

pixval32f( v, r, c ) );

hist[bin] += 1;

}

cvReleaseImage( h );

cvReleaseImage( s );

cvReleaseImage( v );

}

return histo;

}

这个函数将h、s、 v分别取出,然后以从上到下,从左到右的方式遍历以函数histo_bin的评判规则放入相应的bin中(很形象的)。函数histo_bin的评判规则详见下图:

|----|----|----|。。。。|----|------|------|。。。。|-------|

1NH 2NH 3NH NS*NH NS*NH+1 NS*NH+2 NS*NH+NV

OpenCV学习——物体跟踪的粒子滤波算法实现之初始化粒子集

particle* init_distribution( CvRect* regions, histogram** histos, int n, int p)

{

particle* particles;

int np;

float x, y;

int i, j, width, height, k = 0;

particles = malloc( p * sizeof( particle ) );

np = p / n;

for( i = 0; i n; i++ )

{

width = regions[i].width;

height = regions[i].height;

x = regions[i].x + width / 2;

y = regions[i].y + height / 2;

for( j = 0; j np; j++ )

{

particles[k].x0 = particles[k].xp = particles[k].x = x;

particles[k].y0 = particles[k].yp = particles[k].y = y;

particles[k].sp = particles[k].s = 1.0;

particles[k].width = width;

particles[k].height = height;

particles[k].histo = histos[i];

particles[k++].w = 0;

}

}

i = 0;

while( k p )

{

width = regions[i].width;

height = regions[i].height;

x = regions[i].x + width / 2;

y = regions[i].y + height / 2;

particles[k].x0 = particles[k].xp = particles[k].x = x;

particles[k].y0 = particles[k].yp = particles[k].y = y;

particles[k].sp = particles[k].s = 1.0;

particles[k].width = width;

particles[k].height = height;

particles[k].histo = histos[i];

particles[k++].w = 0;

i = ( i + 1 ) % n;

}

return particles;

}

程序中的变量np是指若有多个区域n,则一个区域内的粒子数为p/n,这样粒子的总数为p。然后程序对每个区域(n个)中p/n个粒子进行初始化,三个位置坐标都为选定区域的中点,比例都为1,宽度和高度为选定区域的高度。然后又跑了个循环确定p个粒子被初始化。

OpenCV学习——物体跟踪的粒子滤波算法实现之粒子集合变换

particle transition( particle p, int w, int h, gsl_rng* rng )

{

float x, y, s;

particle pn;

x = A1 * ( p.x - p.x0 ) + A2 * ( p.xp - p.x0 ) +

B0 * gsl_ran_gaussian( rng, TRANS_X_STD ) + p.x0;

pn.x = MAX( 0.0, MIN( (float)w - 1.0, x ) );

y = A1 * ( p.y - p.y0 ) + A2 * ( p.yp - p.y0 ) +

B0 * gsl_ran_gaussian( rng, TRANS_Y_STD ) + p.y0;

pn.y = MAX( 0.0, MIN( (float)h - 1.0, y ) );

s = A1 * ( p.s - 1.0 ) + A2 * ( p.sp - 1.0 ) +

B0 * gsl_ran_gaussian( rng, TRANS_S_STD ) + 1.0;

pn.s = MAX( 0.1, s );

pn.xp = p.x;

pn.yp = p.y;

pn.sp = p.s;

pn.x0 = p.x0;

pn.y0 = p.y0;

pn.width = p.width;

pn.height = p.height;

pn.histo = p.histo;

pn.w = 0;

return pn;

}

程序使用动态二阶自回归模型作为基本变换思路,变换的对象有坐标x,坐标y,和比例s。变换的x和y要符合在width和height之内的条件。

OpenCV学习——物体跟踪的粒子滤波算法实现之粒子集重新采样

particle* resample( particle* particles, int n )

{

particle* new_particles;

int i, j, np, k = 0;

qsort( particles, n, sizeof( particle ), particle_cmp );

new_particles = malloc( n * sizeof( particle ) );

for( i = 0; i n; i++ )

{

np = cvRound( particles[i].w * n );

for( j = 0; j np; j++ )

{

new_particles[k++] = particles[i];

if( k == n )

goto exit;

}

}

while( k n )

new_particles[k++] = particles[0];

exit:

return new_particles;

}

程序先使用C标准库中的qsort排序函数,按照权重,由大到小将原粒子集排序。然后将权重大的在新的粒子集中分配的多一点。

OpenCV学习——物体跟踪的粒子滤波算法实现之权重归一化

void normalize_weights( particle* particles, int n )

{

float sum = 0;

int i;

for( i = 0; i n; i++ )

sum += particles[i].w;

for( i = 0; i n; i++ )

particles[i].w /= sum;

}

目标跟踪检测算法(一)——传统方法

姓名:刘帆;学号:20021210609;学院:电子工程学院

【嵌牛导读】目标跟踪算法研究难点与挑战在于实际复杂的应用环境 、背景相似干扰、光照条件的变化、遮挡等外界因素以及目标姿态变化,外观变形,尺度变化、平面外旋转、平面内旋转、出视野、快速运动和运动模糊等。而且当目标跟踪算法投入实际应用时,不可避免的一个问题——实时性问题也是非常的重要。正是有了这些问题,才使得算法研究充满着难点和挑战。

【嵌牛鼻子】目标跟踪算法,传统算法

【嵌牛提问】利用目标跟踪检测算法要达到何目的?第一阶段的单目标追踪算法包括什么?具体步骤有哪些?它们有何特点?

【嵌牛正文】

第一阶段

目标跟踪分为两个部分,一个是对指定目标寻找可以跟踪的特征,常用的有颜色,轮廓,特征点,轨迹等,另一个是对目标特征进行跟踪。

1、静态背景

1)背景差: 对背景的光照变化、噪声干扰以及周期性运动等进行建模。通过当前帧减去背景图来捕获运动物体的过程。

2)帧差: 由于场景中的目标在运动,目标的影像在不同图像帧中的位置不同。该类算法对时间上连续的两帧或三帧图像进行差分运算,不同帧对应的像素点相减,判断灰度差的绝对值,当绝对值超过一定阈值时,即可判断为运动目标,从而实现目标的检测功能。

与二帧差分法不同的是,三帧差分法(交并运算)去除了重影现象,可以检测出较为完整的物体。帧间差分法的原理简单,计算量小,能够快速检测出场景中的运动目标。但帧间差分法检测的目标不完整,内部含有“空洞”,这是因为运动目标在相邻帧之间的位置变化缓慢,目标内部在不同帧图像中相重叠的部分很难检测出来。帧间差分法通常不单独用在目标检测中,往往与其它的检测算法结合使用。

3)Codebook

算法为图像中每一个像素点建立一个码本,每个码本可以包括多个码元(对应阈值范围),在学习阶段,对当前像素点进行匹配,如果该像素值在某个码元的学习阈值内,也就是说与之前出现过的某种历史情况偏离不大,则认为该像素点符合背景特征,需要更新对应点的学习阈值和检测阈值。

如果新来的像素值与每个码元都不匹配,则可能是由于动态背景导致,这种情况下,我们需要为其建立一个新的码元。每个像素点通过对应多个码元,来适应复杂的动态背景。

在应用时,每隔一段时间选择K帧通过更新算法建立CodeBook背景模型,并且删除超过一段时间未使用的码元。

4)GMM

混合高斯模型(Gaussian of Micture Models,GMM)是较常用的背景去除方法之一(其他的还有均值法、中值法、滑动平均滤波等)。

首先我们需要了解单核高斯滤波的算法步骤:

混合高斯建模GMM(Gaussian Mixture Model)作为单核高斯背景建模的扩展,是目前使用最广泛的一种方法,GMM将背景模型描述为多个分布,每个像素的R、G、B三个通道像素值的变化分别由一个混合高斯模型分布来刻画,符合其中一个分布模型的像素即为背景像素。作为最常用的一种背景建模方法,GMM有很多改进版本,比如利用纹理复杂度来更新差分阈值,通过像素变化的剧烈程度来动态调整学习率等。

5)ViBe(2011)

ViBe算法主要特点是随机背景更新策略,这和GMM有很大不同。其步骤和GMM类似。具体的思想就是为每个像素点存储了一个样本集,样本集中采样值就是该像素点过去的像素值和其邻居点的像素值,然后将每一个新的像素值和样本集进行比较来判断是否属于背景点。

其中pt(x)为新帧的像素值,R为设定值,p1、p2、p3….为样本集中的像素值,以pt(x)为圆心R为半径的圆被认为成一个集,当样本集与此集的交集大于设定的阈值#min时,可认为此为背景像素点(交集越大,表示新像素点与样本集越相关)。我们可以通过改变#min的值与R的值来改变模型的灵敏度。

Step1:初始化单帧图像中每个像素点的背景模型。假设每一个像素和其邻域像素的像素值在空域上有相似的分布。基于这种假设,每一个像素模型都可以用其邻域中的像素来表示。为了保证背景模型符合统计学规律,邻域的范围要足够大。当输入第一帧图像时,即t=0时,像素的背景模型。其中,NG(x,y)表示空域上相邻的像素值,f(xi,yi)表示当前点的像素值。在N次的初始化的过程中,NG(x,y)中的像素点(xi,yi)被选中的可能次数为L=1,2,3,…,N。

Step2:对后续的图像序列进行前景目标分割操作。当t=k时,像素点(x,y)的背景模型为BKm(x,y),像素值为fk(x,y)。按照下面判断该像素值是否为前景。这里上标r是随机选的;T是预先设置好的阈值。当fk(x,y)满足符合背景#N次时,我们认为像素点fk(x,y)为背景,否则为前景。

Step3:ViBe算法的更新在时间和空间上都具有随机性。每一个背景点有1/ φ的概率去更新自己的模型样本值,同时也有1/ φ的概率去更新它的邻居点的模型样本值。更新邻居的样本值利用了像素值的空间传播特性,背景模型逐渐向外扩散,这也有利于Ghost区域的更快的识别。同时当前景点计数达到临界值时将其变为背景,并有1/ φ的概率去更新自己的模型样本值(为了减少缓慢移动物体的影响和摄像机的抖动)。

可以有如下总结,ViBe中的每一个像素点在更新的时候都有一个时间和空间上随机影响的范围,这个范围很小,大概3x3的样子,这个是考虑到摄像头抖动时会有坐标的轻微来回变化,这样虽然由于ViBe的判别方式仍认为是背景点,但是也会对后面的判别产生影响,为了保证空间的连续性,随机更新减少了这个影响。而在样本值保留在样本集中的概率随着时间的增大而变小,这就保证了像素模型在时间上面的延续特性。

6)光流

光流是由物体或相机的运动引起的图像对象在两个连续帧之间的视在运动模式。它是2D矢量场,其中每个矢量是一个位移矢量,显示点从第一帧到第二帧的移动。

光流实际上是一种特征点跟踪方法,其计算的为向量,基于三点假设:

1、场景中目标的像素在帧间运动时亮度(像素值或其衍生值)不发生变化;2、帧间位移不能太大;3、同一表面上的邻近点都在做相同的运动;

光流跟踪过程:1)对一个连续视频帧序列进行处理;2)对每一帧进行前景目标检测;3)对某一帧出现的前景目标,找出具有代表性的特征点(Harris角点);4)对于前后帧做像素值比较,寻找上一帧在当前帧中的最佳位置,从而得到前景目标在当前帧中的位置信息;5)重复上述步骤,即可实现目标跟踪

2、运动场(分为相机固定,但是视角变化和相机是运动的)

1)运动建模(如视觉里程计运动模型、速度运动模型等)

运动学是对进行刚性位移的相机进行构型,一般通过6个变量来描述,3个直角坐标,3个欧拉角(横滚、俯仰、偏航)。

Ⅰ、对相机的运动建模

由于这个不是我们本次所要讨论的重点,但是在《概率机器人》一书中提出了很多很好的方法,相机的运动需要对图像内的像素做位移矩阵和旋转矩阵的坐标换算。除了对相机建立传统的速度运动模型外,也可以用视觉里程计等通关过置信度的更新来得到概率最大位置。

Ⅱ、对于跟踪目标的运动建模

该方法需要提前通过先验知识知道所跟踪的目标对象是什么,比如车辆、行人、人脸等。通过对要跟踪的目标进行建模,然后再利用该模型来进行实际的跟踪。该方法必须提前知道要跟踪的目标对象是什么,然后再去跟踪指定的目标,这是它的局限性,因而其推广性相对比较差。(比如已知跟踪的物体是羽毛球,那很容易通过前几帧的取点,来建立整个羽毛球运动的抛物线模型)

2)核心搜索算法(常见的预测算法有Kalman(卡尔曼)滤波、扩展卡尔曼滤波、粒子滤波)

Ⅰ、Kalman 滤波

Kalman滤波器是通过前一状态预测当前状态,并使用当前观测状态进行校正,从而保证输出状态平稳变化,可有效抵抗观测误差。因此在运动目标跟踪中也被广泛使用。

在视频处理的运动目标跟踪里,每个目标的状态可表示为(x,y,w,h),x和y表示目标位置,w和h表示目标宽高。一般地认为目标的宽高是不变的,而其运动速度是匀速,那么目标的状态向量就应该扩展为(x,y,w,h,dx,dy),其中dx和dy是目标当前时刻的速度。通过kalman滤波器来估计每个时刻目标状态的大致过程为:

对视频进行运动目标检测,通过简单匹配方法来给出目标的第一个和第二个状态,从第三个状态开始,就先使用kalman滤波器预测出当前状态,再用当前帧图像的检测结果作为观测值输入给kalman滤波器,得到的校正结果就被认为是目标在当前帧的真实状态。(其中,Zt为测量值,为预测值,ut为控制量,Kt为增益。)

Ⅱ、扩展卡尔曼滤波(EKF)和无迹卡尔曼滤波(UKF)

由于卡尔曼滤波的假设为线性问题,无法直接用在非线性问题上,EKF和UKF解决了这个问题(这个线性问题体现在用测量量来计算预测量的过程中)。EKF是通过构建线性函数g(x),与非线性函数相切,并对每一时刻所求得的g(x)做KF,如下图所示。

UKF与EKF去求解雅可比矩阵拟合线性方程的方法不同,通过对那个先验分布中的采集点,来线性化随机变量的非线性函数。与EKF所用的方法不同,UKF产生的高斯分布和实际高斯分布更加接近,其引起的近似误差也更小。

Ⅲ、粒子滤波

1、初始状态:基于粒子滤波的目标追踪方法是一种生成式跟踪方法,所以要有一个初始化的阶段。对于第一帧图像,人工标定出待检测的目标,对该目标区域提出特征;

2、搜索阶段:现在已经知道了目标的特征,然后就在目标的周围撒点(particle), 如:a)均匀的撒点;b)按高斯分布撒点,就是近的地方撒得多,远的地方撒的少。论文里使用的是后一种方法。每一个粒子都计算所在区域内的颜色直方图,如初始化提取特征一样,然后对所有的相似度进行归一化。文中相似性使用的是巴氏距离;

3、重采样:根据粒子权重对粒子进行筛选,筛选过程中,既要大量保留权重大的粒子,又要有一小部分权重小的粒子;

4、状态转移:将重采样后的粒子带入状态转移方程得到新的预测粒子;

5、测量及更新:对目标点特征化,并计算各个粒子和目标间的巴氏距离,更新粒子的权重;

6、决策阶段:每个粒子都获得一个和目标的相似度,相似度越高,目标在该范围出现的可能性越高,将保留的所有粒子通过相似度加权后的结果作为目标可能的位置。

3)Meanshift算法

MeanShift算法属于核密度估计法,它不需要任何先验知识而完全依靠特征空间中样本点的计算其密度函数值。对于一组采样数据,直方图法通常把数据的值域分成若干相等的区间,数据按区间分成若干组,每组数据的个数与总参数个数的比率就是每个单元的概率值;核密度估计法的原理相似于直方图法,只是多了一个用于平滑数据的核函数。采用核函数估计法,在采样充分的情况下,能够渐进地收敛于任意的密度函数,即可以对服从任何分布的数据进行密度估计。

Meanshift算法步骤

1、通过对初始点(或者上一帧的目标点)为圆心,绘制一个半径为R的圆心,寻找特征和该点相似的点所构成的向量;

2、所有向量相加,可以获得一个向量叠加,这个向量指向特征点多的方向;

3、取步骤二的向量终点为初始点重复步骤一、二,直到得到的向量小于一定的阈值,也就是说明当前位置是特征点密度最密集的地方,停止迭代,认为该点为当前帧的目标点;

4)Camshift算法

Camshift算法是MeanShift算法的改进,称为连续自适应的MeanShift算法。Camshift 是由Meanshift 推导而来 Meanshift主要是用在单张影像上,但是独立一张影像分析对追踪而言并无意义,Camshift 就是利用MeanShift的方法,对影像串列进行分析。

1、首先在影像串列中选择目标区域。

2、计算此区域的颜色直方图(特征提取)。

3、用MeanShift演算法来收敛欲追踪的区域。

4、通过目标点的位置和向量信息计算新的窗口大小,并标示之。

5、以此为参数重复步骤三、四。

Camshift 关键就在于当目标的大小发生改变的时候,此算法可以自适应调整目标区域继续跟踪。

3、小结

第一阶段的单目标追踪算法基本上都是传统方法,计算量小,在嵌入式等设备中落地较多,opencv中也预留了大量的接口。通过上面的两节的介绍,我们不难发现,目标检测算法的步骤分为两部分,一部分是对指定目标寻找可以跟踪的特征,常用的有颜色,轮廓,特征点,轨迹等,另一部分是对目标特征进行跟踪,如上文所提及的方法。所以目标检测方法的发展,也可总结为两个方面,一个是如何去获得更加具有区分性的可跟踪的稳定特征,另一个是如何建立帧与帧之间的数据关联,保证跟踪目标是正确的。

随着以概率为基础的卡尔曼滤波、粒子滤波或是以Meanshift为代表向量叠加方法在目标检测的运用,使得目标检测不再需要假设自身的一个状态为静止的,而是可以是运动的,更加符合复杂场景中的目标跟踪。

如何用c语言编写跟踪程序~~以往是用粒子滤波算法跟踪

Python break语句,就像在C语言中,打破了最小封闭for或while循环。

break语句用来终止循环语句,即循环条件没有False条件或者序列还没被完全递归完,也会停止执行循环语句。

break语句用在while和for循环中。

如果您使用嵌套循环,break语句将停止执行最深层的循环,并开始执行下一行代码。

粒子滤波算法的具体流程是怎样的?

粒子滤波(PF: Particle Filter)算法起源于20世纪50年代Poor Man's Monte Carlo问题的研究,但第一个具有应用性的粒子滤波算法于1993年由Gordon等提出(“A novel Approach to nonlinear/non-Gaussian Bayesian State estimation”)。它是利用粒子集来表示概率,可以用在任何形式的状态空间模型上。其核心思想是通过从后验概率中抽取的随机状态粒子来表示其分布情况,是一种顺序重要性采样法(Sequential Importance Sampling)。

粒子滤波的应用非常广泛,尤其是在目标跟踪(“A probabilistic framework for matching temporal trajectories”)等视觉任务方面。粒子滤波算法有许多不同的改进方式。针对不同的问题,PF算法被改造以适应更好的问题。本文主要侧重于目标跟踪方面的应用。以人脸跟踪为例,下图展示了粒子滤波的跟踪结果。下面介绍下粒子滤波的基本过程:初始化、概率转移、权重重计算和重采样四个阶段。

1.初始化阶段

跟踪区域初始化。在使用粒子滤波算法进行目标跟踪前需要选择要跟踪的目标物体。这个过程可以用人工划定方法和自动识别方法。使用人工的方法可以通过鼠标在图像区域标记出一个感兴趣矩形;使用自动的方法就是利用自动的目标检测技术,初步检测出图像中要跟踪物体的大致位置。以人脸跟踪为例,人工方法就是鼠标划定视频第一帧中人脸的区域;自动方法就是可以使用人脸检测算法检测出人脸的初始位置。

粒子初始化。对于本文人脸检测的示例,粒子就是图像中的矩形区域,主要由矩形中心(x,y)和宽高(w,h)四个变量表示。粒子初始化的步骤,就是在图像中选择指定数量的粒子(矩形),比如N=100个粒子。粒子初始化过程就是在图像中随机或指定方式放粒子。比如说,我们可以指定100个粒子初始状态和跟踪区域一致,即粒子参数和跟踪区域的(x,y,w,h)相等。

2.状态转移阶段

使用粒子滤波算法来对目标进行跟踪,即是通过前一次的先验概率来估算出当前环境下的后验概率密度,这个过程也是由粒子来完成的。具体来说,即根据上一帧中粒子的状态(x,y,w,h)t-1,来估计出本帧中各个粒子的状态(x,y,w,h)t。从上一帧图像的粒子状态转变为当前帧粒子的状态,这个变异过程就叫作转移(transmission)。粒子滤波的转移方程跟Kalman滤波的差不多:

上面的是状态转移方程,下面的为观测方程,wk和vk是高斯噪声。在本文示例中,xk=(x,y,w,h)t。变量x,y,w,h可以依据公式(1)分别更新。在不同的算法中,f采用的函数也不相同。如果xk=xk-1+wk,则状态转移方程其实是随机游走过程;如果xk=Axk-1+wk,状态转移方程则为一阶自回归方程;如果xk=A1xk-1+A2xk-2+wk,则状态转移方程为二阶自回归方程。

3.权重重计算阶段

转移阶段将上一帧中粒子的位置进行了转移,得到当前帧中新的位置。但并不是所有粒子的作用都有用。也就是有些粒子并不是跟踪区域所要所移动的位置。因此,在此阶段,粒子滤波算法将对每个粒子进行打分,将得分较低的粒子删除,将得分多的粒子生成更多的粒子(重采样过程完成)。具体打分的方法根据不同的需求会不同,例如人脸跟踪方法中使用距离作为衡量的标准。将每个粒子与跟踪区域进行相似度计算(在这里,分别提取粒子和跟踪区域的视觉特征进行计算,比如颜色直方图),使用相似度作为相应粒子的权重。每一个粒子都需要计算其权重,并且需要将其归一化。该阶段其实也是后验概率进行更新的过程。

4.重采样阶段

粒子滤波算法会淘汰权值低的粒子,让权值高的粒子来产生出更多的粒子,这就使得算法朝着权值高的地方收敛。假设有100个粒子,1号粒子的权重为0.02而2号粒子的权重为0.003。于是在重采样阶段,1号粒子生孩子的指标是0.02×100=2,2号粒子的指标是0.003×100=0.3,可以发现,1号粒子除了刚产生的粒子外还要再额外的产生一个粒子,而2号粒子就被铲除了。如此,最后得到的100个粒子即为所求,然后取个加权平均就得到了目标的状态值。

救命啊!!关于改进粒子滤波算法问题

粒子滤波算法的核心思想是:为了求解数学或物理等方面的问题,首先建立一个概率模型或者随机过程,使它的参数等于问题的解;然后通过对模型或过程的观察或采样试验计算所求参数的统计特征;最后给出所求解的近似值。

下面详细介绍粒子滤波的基本思想。

粒子滤波就是用完全描述后验概率密度分布

这里,x0:k={xj,j=0,…,k},z0:k={zj,j=0,…,k},分别表示各个时刻的系统状态和观测状态,表示j时刻所对应的粒子的归一化权值,即

直接从后验概率p(x0:k|z1:k)中进行取样是比较困难的。假设存在π(x),有并且可以很方便地从π(x)中进行取样,这样的π(x)称作重要性密度。根据贝叶斯理论有:

这样,就能很容易对系统状态进行估计,权值的递推方程可以写成:

在k时刻的后验概率密度可以近似地写成:

1.2 粒子滤波算法改进策略

传统的粒子滤波算法需要使用状态转移后的所有粒子进行系统观测和重采样。这使得计算量很大,而且增加了错误信息,甚至会导致跟踪目标漂移。鉴于此,笔者对传统的粒子滤波进行了一系列的改进。在对系统观测过程进行改进时,只选取局部最优粒子(即权值较大的粒子)进行状态转移;在重采样环节,也使用了这种局部最优原理,只选取部分大权值粒子。改进的粒子滤波算法,能够在很大程度上解决上述问题。

图1描述的是状态转移环节,当前时刻所有粒子对应的位置服从均匀分布。图中“○”表示跟踪目标在该时刻的真实位置,黑点表示该时刻的粒子,黑点的大小代表粒子权值的大小。

由图发现,离“○”越近的粒子权值越大,超出1/2粒子传播半径的粒子,权值可忽略。根据这种先验知识,基于局部最优化原理选取部分粒子。当利用粒子进行系统观测时,将粒子按权值大小依次排序,只需选取半数大权值粒子,就能很准确地计算出最优估计的位置。这种改进策略可使该环节的计算量减少40%。由于忽略了远处的粒子,剔除了部分错误信息,因此跟踪精度也得到了提高。

粒子重采样环节的改进是分裂粒子时只选取上述的半数大权值粒子。改进的重采样具体实现过程如下:将系统观测过程中使用的粒子,按大小排序均分为两组。权值大的一组,每个粒子分裂为三个新的粒子;权值较小的一组,每个粒子只生成一个新粒子。这样做不但简化了计算,提高了运行速度,而且增强了重采样粒子的有效性。

该改进算法的优点:(1)使得后验分布样本更加接近真实分布;(2)大大减少了计算量。多次实验表明,改进算法在人体运动跟踪时较传统算法效果更好,鲁棒性更高。

2 基于改进粒子滤波算法的人体运动跟踪

视频中的特定人体有其独特的运动特征,且其关节运动都是非刚性的。为使运动模型在运动预测中有更好的适用性和更高的准确性,依据统计分析的成果,采用一阶自回归过程ARP(Auto-Regressive Process)动力学模型作为运动模型,并通过训练序列计算出该模型的参数。在模板区域相似性计算的基础上,通过粒子滤波实现人体运动的跟踪。基于这一基本思路,本文提出基于粒子滤波的人体运动跟踪的流程图,如图2所示。

2.1 初始化

跟踪初始化,就是按运动模型的要求,在初始帧形成表示各自分布模型的粒子集。具体过程如下:在被跟踪序列的初始帧中手动提取目标模板,将它作为起始帧的状态向量。提取目标的初始运动参数在状态向量的各分量上加正态随机噪声,构造N个状态向量,即粒子数为N,每个粒子代表一个可能的运动状态。若初始的权值ωi为1,则具有N个运动状态参数这里Pi选择Pinit附近的点。

2.2 采样

采样就是从表示先验模型的状态向量集中按概率选取其中的若干向量。一次采样选取一个状态向量,进行N次这样的采样,得到N个新的状态向量。显然,权值太小的状态向量(即粒子)在采样过程中被选中的概率就小,而且在逐步迭代中可能被丢掉;权值大的粒子被选中的概率就比较大,也可能被多次选中。这样,采样得到的新的粒子集能更好地估计概率分布。

2.3 状态转移

系统状态转移,即粒子的传播过程。从采样得到的新的粒子集出发,经运动模型计算得到预测模型。粒子传播是一种随机运动过程,服从一阶ARP方程。

式中,xt为目标在t时刻的状态,wt-1是归一化噪声量,A和B是常数。这里,t时刻系统的状态转移过程与当前时刻的观测量无关。

粒子Ni的运动状态参量为:

式中,A1、A2、B1、B2为常数,一般A取1,B为粒子传播半径(系统状态转移过程中,粒子所能够传播的范围),W是[-1,1]内的随机数。系统状态转移的实质就是在坐标上迭加一个扰动量。

这一步是先验概率的传播过程,即“假设”目标状态将以何种方式传播。粒子传播是否合理需要通过下一阶段即系统观测进行验证。

2.4 系统观测

系统观测过程就是将当前预测模型中的每一个状态向量所对应的外观模型与由其确定的当前帧图像中的对应区域进行相似性计算,并给每一个状态向量赋一个权值。

每个粒子状态转移后,用对应新坐标计算一个MADi。

定义概率密度函数为:

它作为当前帧的跟踪结果输出。

2.5 重采样

按上述采样、转移和观测过程完成当前帧的跟踪计算后,对当前帧的后验模型进行同样的采样,得到下一帧的先验模型。进而可以对下一帧进行新的预测和观测,继续后续序列的跟踪计算,直至最后一帧,完成跟踪过程。

3 实验仿真和分析

3.1 仿真结果

粒子滤波如何在算法中实现目标跟踪 就是怎么一步步实现跟踪的,求高手帮助

我通俗解释一下,粒子滤波(PF)的应用大致这样:(其实目标跟踪的理论就是对状态向量的实时估值)

设有一堆样本,假设有N个,初始给他们同样的权值1/N。

这个系统状态转移方程,一般是非线性的,我们只需要知道怎么做才能把这时刻的状态值传播到下一个时刻。具体做法,N个样本值通过状态转移得下一时刻的样本预测值,包含过程噪声因素。d

系统还有一个非线性的观测方程,通过它得到真正的观测值Z。这时候,把N个样本预测值带进去获得Z‘。

根据Z’和Z相差的程度,决定对这个样本的可信程度,当然越接近的越好,然后把这些可信程度进行权值归一化。

重采样环节,把这些样本按照权值进行随机采样(权值越高的,当然越容易被抽中。比如说,下一时刻的值,有四个样本说等于1,有两个样本说等于1.5,那么有2/3概率认为等于1.这个解释起来真的有够复杂的,一般做起来200~300个样本获得的值都接近一样了,还要设个2/3n的阈值防止粒子匮乏,也就是防止所有样本得到相同的后验估计结果),获得的值尽可能接近真实发生的情况。

循环2~5

关于粒子滤波跟踪算法代码和相关滤波跟踪算法的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

版权说明:如非注明,本站文章均为 AH站长 原创,转载请注明出处和附带本文链接;

本文地址:http://ahzz.com.cn/post/26782.html


取消回复欢迎 发表评论:

分享到

温馨提示

下载成功了么?或者链接失效了?

联系我们反馈

立即下载