1. 程式人生 > >OpenCV學習筆記(三十六)——Kalman濾波做運動目標跟蹤

OpenCV學習筆記(三十六)——Kalman濾波做運動目標跟蹤

kalman濾波大家都很熟悉,其基本思想就是先不考慮輸入訊號和觀測噪聲的影響,得到狀態變數和輸出訊號的估計值,再用輸出訊號的估計誤差加權後校正狀態變數的估計值,使狀態變數估計誤差的均方差最小。具體它的原理和實現,我想也不用我在這裡費口舌,但這個理論基礎必須的有,必須得知道想用kalman濾波做跟蹤,必須得先建立運動模型和觀察模型,不是想用就能用的。如果不能建立運動模型,也就意味著你所要面對的問題不能用kalman濾波解決。

我結合一下OpenCV自帶的kalman.cpp這個例程來介紹一下如何在OpenCV中使用kalman濾波吧,OpenCV已經把Kalman濾波封裝到一個類KalmanFilter中了。使用起來非常方便,但那繁多的各種矩陣還是容易讓人摸不著頭腦。這裡要知道的一點是,想要用kalman濾波,要知道前一時刻的狀態估計值x,當前的觀測值y,還得建立狀態方程和量測方程。

有了這些就可以運用kalman濾波了。

OpenCV自帶了例程裡面是對一個1維點的運動跟蹤,雖然這個點是在2維平面中運動,但由於它是在一個圓弧上運動,只有一個自由度,角度,所以還是1維的。還是一個勻速運動,建立勻速運動模型,設定狀態變數x = [ x1, x2 ] = [ 角度,角速度 ],則運動模型為

x1(k+1) = x1(k)+x2(k)*T

x2(k+1)= x2(k)

則狀態轉移方程為

x* = Ax + w

這裡設計的噪聲是高斯隨機噪聲,則量測方程為:

z = Cx + v

看了程式碼,對應上以上各項:

狀態估計值x --> state

當前觀測值z --> measurement

KalmanFilter類內成員變數transitionMatrix就是狀態轉移方程中的矩陣A

KalmanFilter類內成員變數measurementMatrix就是量測方程中矩陣C

    Mat statePre;           //!< predicted state (x'(k)): x(k)=A*x(k-1)+B*u(k)
    Mat statePost;          //!< corrected state (x(k)): x(k)=x'(k)+K(k)*(z(k)-H*x'(k))
    Mat transitionMatrix;   //!< state transition matrix (A)
    Mat controlMatrix;      //!< control matrix (B) (not used if there is no control)
    Mat measurementMatrix;  //!< measurement matrix (H)
    Mat processNoiseCov;    //!< process noise covariance matrix (Q)
    Mat measurementNoiseCov;//!< measurement noise covariance matrix (R)
    Mat errorCovPre;        //!< priori error estimate covariance matrix (P'(k)): P'(k)=A*P(k-1)*At + Q)*/
    Mat gain;               //!< Kalman gain matrix (K(k)): K(k)=P'(k)*Ht*inv(H*P'(k)*Ht+R)
    Mat errorCovPost;       //!< posteriori error estimate covariance matrix (P(k)): P(k)=(I-K(k)*H)*P'(k)

我想就不用我再翻譯了吧。相信有了以上的註釋,大家都能找到它們的對應項。

使用的時候,除了初始化我剛剛初始化過的transitionMatrix和measurementMatrix外,還需要初始化processNoiseCov,measurementNoiseCov和errorCovPost

把它們初始化好之後,接下來的動作就很簡單了,分兩步走,第一步呼叫成員函式predict得到當前狀態變數的估計值,第二步呼叫成員函式correct用觀測值校正狀態變數。再更新狀態變數做下一次估計。聽著好簡單啊,程式碼就不上傳坑爹了,在opencv2.3.1\samples\cpp\kalman.cpp中其義自見。