導航:首頁 > 源碼編譯 > 粒子濾波演算法程序

粒子濾波演算法程序

發布時間:2022-06-28 14:32:56

Ⅰ 基於顏色的粒子濾波目標跟蹤演算法MATLAB模擬與改進

我這里有一個粒子群的完整範例:functionmain()clc;clearall;closeall;tic;%程序運行計時E0=0.001;%允許誤差MaxNum=100;%粒子最大迭代次數narvs=1;%目標函數的自變數個數particlesize=30;%粒子群規模c1=2;%每個粒子的個體學習因子,也稱為加速常數c2=2;%每個粒子的社會學習因子,也稱為加速常數w=0.6;%慣性因子vmax=0.8;%粒子的最大飛翔速度x=-5+10*rand(particlesize,narvs);%粒子所在的位置v=2*rand(particlesize,narvs);%粒子的飛翔速度%用inline定義適應度函數以便將子函數文件與主程序文件放在一起,%目標函數是:y=1+(2.1*(1-x+2*x.^2).*exp(-x.^2/2))%inline命令定義適應度函數如下:fitness=inline('1/(1+(2.1*(1-x+2*x.^2).*exp(-x.^2/2)))','x');%inline定義的適應度函數會使程序運行速度大大降低fori=1:particlesizeforj=1:narvsf(i)=fitness(x(i,j));endendpersonalbest_x=x;personalbest_faval=f;[globalbest_favali]=min(personalbest_faval);globalbest_x=personalbest_x(i,:);k=1;whilek<=MaxNumfori=1:particlesizeforj=1:narvsf(i)=fitness(x(i,j));endiff(i)vmax;v(i,j)=vmax;elseifv(i,j)<-vmax;v(i,j)=-vmax;endendx(i,:)=x(i,:)+v(i,:);endifabs(globalbest_faval)<E0,break,endk=k+1;endValue1=1/globalbest_faval-1;Value1=num2str(Value1);%strcat指令可以實現字元的組合輸出disp(strcat('themaximumvalue','=',Value1));%輸出最大值所在的橫坐標位置Value2=globalbest_x;Value2=num2str(Value2);disp(strcat('thecorrespondingcoordinate','=',Value2));x=-5:0.01:5;y=2.1*(1-x+2*x.^2).*exp(-x.^2/2);plot(x,y,'m-','linewidth',3);holdon;plot(globalbest_x,1/globalbest_faval-1,'kp','linewidth',4);legend('目標函數','搜索到的最大值');xlabel('x');ylabel('y');gridon;toc;

Ⅱ 如何用c語言編寫跟蹤程序~~以往是用粒子濾波演算法跟蹤

Python break語句,就像在C語言中,打破了最小封閉for或while循環。
break語句用來終止循環語句,即循環條件沒有False條件或者序列還沒被完全遞歸完,也會停止執行循環語句。
break語句用在while和for循環中。
如果您使用嵌套循環,break語句將停止執行最深層的循環,並開始執行下一行代碼。

Ⅲ 有粒子濾波演算法及其應用這本書上的常式程序嗎

有粒子濾波演算法及其應用這本書上的常式程序
數據抽取法從已經存在的維度的數據中抽取內容組的名字,從而組成內容組。這個方法使用正則表達式來分析維度,並自動抽取其中的數據來形成分組。
需要指出,建立的組名是存在於頁面標題維度中,然後利用一個正則表達式提取恰當的值形成的。
對於那些不使用正則表達式的人,括弧中的值會自動被提取,接著Google Analytics會使用該值作為組名。將會看到這個規則適用於所有5中的產品頁,只要產品頁的page title的格式是規整的。
優點:無需手動配置代碼,採集方式靈活。
缺點:添加新的內容到網站或應用程序,就可能需要更新正則表達式,尤其是一些不符合新的情況的正則表達式。
如果不熟悉正則表達式,這里有一個Google官方的快速入門。

Ⅳ 粒子濾波程序重采樣代碼求助

粒子濾波演算法受到許多領域的研究人員的重視,該演算法的主要思想是使用一個帶有權值的粒子集合來表示系統的後驗概率密度.在擴展卡爾曼濾波和Unscented卡爾曼濾波演算法的基礎上,該文提出一種新型粒子濾波演算法.首先用Unscented卡爾曼濾波器產生系統的狀態估計,然後用擴展卡爾曼濾波器重復這一過程並產生系統在k時刻的最終狀態估計.在實驗中,針對非線性程度不同的兩種系統,分別採用5種粒子濾波演算法進行實驗

Ⅳ 誰有粒子濾波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;
}

Ⅵ 粒子濾波如何在演算法中實現目標跟蹤 就是怎麼一步步實現跟蹤的,求高手幫助

我通俗解釋一下,粒子濾波(PF)的應用大致這樣:(其實目標跟蹤的理論就是對狀態向量的實時估值)

  1. 設有一堆樣本,假設有N個,初始給他們同樣的權值1/N。

  2. 這個系統狀態轉移方程,一般是非線性的,我們只需要知道怎麼做才能把這時刻的狀態值傳播到下一個時刻。具體做法,N個樣本值通過狀態轉移得下一時刻的樣本預測值,包含過程雜訊因素。d

  3. 系統還有一個非線性的觀測方程,通過它得到真正的觀測值Z。這時候,把N個樣本預測值帶進去獲得Z『。

  4. 根據Z』和Z相差的程度,決定對這個樣本的可信程度,當然越接近的越好,然後把這些可信程度進行權值歸一化。

  5. 重采樣環節,把這些樣本按照權值進行隨機采樣(權值越高的,當然越容易被抽中。比如說,下一時刻的值,有四個樣本說等於1,有兩個樣本說等於1.5,那麼有2/3概率認為等於1.這個解釋起來真的有夠復雜的,一般做起來200~300個樣本獲得的值都接近一樣了,還要設個2/3n的閾值防止粒子匱乏,也就是防止所有樣本得到相同的後驗估計結果),獲得的值盡可能接近真實發生的情況。

  6. 循環2~5

Ⅶ 粒子濾波演算法的具體流程是怎樣的

粒子濾波(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個粒子即為所求,然後取個加權平均就得到了目標的狀態值。

Ⅷ 救命啊!!關於改進粒子濾波演算法問題

粒子濾波演算法受到許多領域的研究人員的重視,該演算法的主要思想是使用一個帶有權值的粒子集合來表示系統的後驗概率密度.在擴展卡爾曼濾波和Unscented卡爾曼濾波演算法的基礎上,該文提出一種新型粒子濾波演算法.首先用Unscented卡爾曼濾波器產生系統的狀態估計,然後用擴展卡爾曼濾波器重復這一過程並產生系統在k時刻的最終狀態估計.在實驗中,針對非線性程度不同的兩種系統,分別採用5種粒子濾波演算法進行實驗

Ⅸ 粒子濾波程序中plot的xArr代表什麼意思

其實卡爾曼、粒子是叫估計器estimator。估計estimate當前值叫濾波filtering,估計過去叫平滑smoothing,估計未來叫預測prediction。不過為了方便,往往就叫濾波器了。

至於高通,低通,則是濾波幾個相互正交的分類:

低通,高通
開環,閉環(有無iterate)
線性,非線性
時變,定常
動態系統,靜態系統
最小方差與否
等等

比如steady-state時卡爾曼濾波是低通濾波,等等。

卡爾曼濾波,包括KF(線性),EKF(非線性),UKF(非線性),SRUKF(非線性)等,要求後驗是高斯。

PF則不僅可以處理非線性,還可以處理非高斯。

其實還有雜訊是否白雜訊的問題,不過有色雜訊可以近似成白雜訊經過一個濾波器的話,就好處理。

還有雜訊是否零均值的問題,這個問題看似簡單,其實很多很重要,比如如何處理感測器數值的漂移,乃至如何確定確定性的干擾~

閱讀全文

與粒子濾波演算法程序相關的資料

熱點內容
logback壓縮 瀏覽:888
冰箱壓縮機可以用氣割嗎 瀏覽:531
菜鳥如何加密商品信息 瀏覽:315
程序員那麼可愛小說結局 瀏覽:862
zenity命令 瀏覽:564
監禁風暴哪個app有 瀏覽:865
程序員的愛心是什麼 瀏覽:591
java中對字元串排序 瀏覽:290
單片機用數模轉換生成三角波 瀏覽:634
外網怎麼登陸伺服器地址 瀏覽:134
什麼人要懂編譯原理 瀏覽:151
源碼改單 瀏覽:714
pdfzip 瀏覽:876
壓縮空氣25兆帕會變成液體嗎 瀏覽:56
linux測試伺服器性能 瀏覽:956
dlp硬碟加密 瀏覽:365
應用加密裡面打不開 瀏覽:861
基於單片機的超聲波測距儀的設計 瀏覽:745
xp自動備份指定文件夾 瀏覽:664
我的世界伺服器如何讓世界平坦 瀏覽:173