粒子濾波演算法
❶ 誰有粒子濾波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; 
}
❷ 救命啊!!關於改進粒子濾波演算法問題
粒子濾波演算法受到許多領域的研究人員的重視,該演算法的主要思想是使用一個帶有權值的粒子集合來表示系統的後驗概率密度.在擴展卡爾曼濾波和Unscented卡爾曼濾波演算法的基礎上,該文提出一種新型粒子濾波演算法.首先用Unscented卡爾曼濾波器產生系統的狀態估計,然後用擴展卡爾曼濾波器重復這一過程並產生系統在k時刻的最終狀態估計.在實驗中,針對非線性程度不同的兩種系統,分別採用5種粒子濾波演算法進行實驗
❸ 粒子濾波演算法是什麼時間,由誰最先提出來的啊
1993年有Gordon和Salmond提出了一種新的基於SIS方法的Bootstrap非線性濾波方法,從此奠定了粒子濾波演算法的基礎。論文:Novel approach to non-linear and non-gaussion Bayesian state estimation.
❹ 如何將下面的離散化公式用粒子(群)濾波演算法估計Qo和po(matlab程序實現).
這個確實有難度啊
❺ 求助!粒子濾波演算法的權值是如何計算的計算式子是根據什麼得到的
這里邊的權重公式取決於你用什麼樣的標准來衡量它的真正價值的接觸,其實只是一個標准。
❻ 粒子濾波的粒子濾波的發展
 Unscented Kalman濾波器(UKF)是Julier等人提出的。EKF(Extended Kalman Filter)使用一階Taylor展開式逼近非線性項,用高斯分布近似狀態分布。UKF類似於EKF,用高斯分布逼近狀態分布,但不需要線性化只使用少數幾個稱為Sigma點的樣本。這些點通過非線性模型後,所得均值和方差能夠精確到非線性項Taylor展開式的二階項,從而對非線性濾波精度更高。Merwe等人提出使用UKF產生PF的重要性分布,稱為Unscented粒子濾波器(UPF),由UKF產生的重要性分布與真實狀態PDF的支集重疊部分更大,估計精度更高。
Rao-Blackwellised粒子濾波器(RBPF)
在高維狀態空間中采樣時,PF的效率很低。對某些狀態空間模型,狀態向量的一部分在其餘部分的條件下的後驗分布可以用解析方法求得,例如某些狀態是條件線性高斯模型,可用Kalman濾波器得到條件後驗分布,對另外部分狀態用PF,從而得到一種混合濾波器,降低了PF采樣空間的維數,RBPF樣本的重要性權的方差遠遠低於SIR方法的權的方差,為使用粒子濾波器解決 SLAM問題提供了理論基礎。而Montemerlo等人在2002年首次將Rao-Blackwellised粒子濾波器應用到機器人SLAM中,並取名為FastSLAM演算法。該演算法將SLAM問題分解成機器人定位問題和基於位姿估計的環境特徵位置估計問題,用粒子濾波演算法做整個路徑的位置估計,用EKF估計環境特徵的位置,每一個EKF對應一個環境特徵。該方法融合EKF和概率方法的優點,既降低了計算的復雜度,又具有較好的魯棒性。
最近幾年,粒子方法又出現了一些新的發展,一些領域用傳統的分析方法解決不了的問題,現在可以藉助基於粒子模擬的方法來解決。在動態系統的模型選擇、故障檢測、診斷方面,出現了基於粒子的假設檢驗、粒子多模型、粒子似然度比檢測等方法。在參數估計方面,通常把靜止的參數作為擴展的狀態向量的一部分,但是由於參數是靜態的,粒子會很快退化成一個樣本,為避免退化,常用的方法有給靜態參數人為增加動態雜訊以及Kernel平滑方法,而Doucet等提出的點估計方法避免對參數直接采樣,在粒子框架下使用最大似然估計(ML)以及期望值最大(EM)演算法直接估計未知參數。

❼ 粒子濾波演算法及其應用的基本信息
書名: 粒子濾波演算法及其應用
I S B N : 9787030276117
定價: ¥48.00

❽ 粒子濾波演算法是什麼時間,由誰最先提出來的
我通俗解釋一下,粒子濾波(PF)的應用大致這樣:(其實目標跟蹤的理論就是對狀態向量的實時估值)
設有一堆樣本,假設有N個,初始給他們同樣的權值1/N.
這個系統狀態轉移方程,一般是非線性的,我們只需要知道怎麼做才能把這時刻的狀態值傳播到下一個時刻.具體做法,N個樣本值通過狀態轉移得下一時刻的樣本預測值,包含過程雜訊因素.d
系統還有一個非線性的觀測方程,通過它得到真正的觀測值Z.這時候,把N個樣本預測值帶進去獲得Z『.
根據Z』和Z相差的程度,決定對這個樣本的可信程度,當然越接近的越好,然後把這些可信程度進行權值歸一化.
重采樣環節,把這些樣本按照權值進行隨機采樣(權值越高的,當然越容易被抽中.比如說,下一時刻的值,有四個樣本說等於1,有兩個樣本說等於1.5,那麼有2/3概率認為等於1.這個解釋起來真的有夠復雜的,一般做起來200~300個樣本獲得的值都接近一樣了,還要設個2/3n的閾值防止粒子匱乏,也就是防止所有樣本得到相同的後驗估計結果),獲得的值盡可能接近真實發生的情況.
循環2~5
❾ 粒子濾波器中的,粒子指的是什麼
貝葉斯抽樣
