生活随笔
收集整理的這篇文章主要介紹了
kalman 滤波 演示与opencv代码
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在機器視覺中追蹤時常會用到預測算法,kalman是你一定知道的。它可以用來預測各種狀態,比如說位置,速度等。關于它的理論有很多很好的文獻可以參考。opencv給出了kalman filter的一個實現,而且有范例,但估計不少人對它的使用并不清楚,因為我也是其中一個。本文的應用是對二維坐標進行預測和平滑
?
使用方法:
1、初始化
const int stateNum=4;//狀態數,包括(x,y,dx,dy)坐標及速度(每次移動的距離)
const int measureNum=2;//觀測量,能看到的是坐標值,當然也可以自己計算速度,但沒必要
Kalman* kalman = cvCreateKalman( stateNum, measureNum, 0 );//state(x,y,detaX,detaY)
轉移矩陣或者說增益矩陣的值好像有點莫名其妙
[cpp]?view plain
?copy float?A[stateNum][stateNum]?={?? ????????1,0,1,0,?? ????????0,1,0,1,?? ????????0,0,1,0,?? ????????0,0,0,1?? ????};??
看下圖就清楚了
X1=X+dx,依次類推
所以這個矩陣還是很容易卻確定的,可以根據自己的實際情況定制轉移矩陣
同樣的方法,三維坐標的轉移矩陣可以如下
[cpp]?view plain
?copy float?A[stateNum][stateNum]?={?? ????????1,0,0,1,0,0,?? ????????0,1,0,0,1,0,?? ????????0,0,1,0,0,1,?? ????????0,0,0,1,0,0,?? ????????0,0,0,0,1,0,?? ????????0,0,0,0,0,1?? ????};??
當然并不一定得是1和0
2.預測cvKalmanPredict,然后讀出自己需要的值
3.更新觀測矩陣?
4.更新CvKalman
?只有第一步麻煩些。上述這幾步跟代碼中的序號對應
?如果你在做tracking,下面的例子或許更有用些。
?
[cpp]?view plain
?copy #include?<cv.h>?? #include?<cxcore.h>?? #include?<highgui.h>?? ?? #include?<cmath>?? #include?<vector>?? #include?<iostream>?? using?namespace?std;?? ?? const?int?winHeight=600;?? const?int?winWidth=800;?? ?? ?? CvPoint?mousePosition=cvPoint(winWidth>>1,winHeight>>1);?? ?? ?? void?mouseEvent(int?event,?int?x,?int?y,?int?flags,?void?*param?)?? {?? ????if?(event==CV_EVENT_MOUSEMOVE)?{?? ????????mousePosition=cvPoint(x,y);?? ????}?? }?? ?? int?main?(void)?? {?? ?????? ????const?int?stateNum=4;?? ????const?int?measureNum=2;?? ????CvKalman*?kalman?=?cvCreateKalman(?stateNum,?measureNum,?0?);?? ????CvMat*?process_noise?=?cvCreateMat(?stateNum,?1,?CV_32FC1?);?? ????CvMat*?measurement?=?cvCreateMat(?measureNum,?1,?CV_32FC1?);?? ????CvRNG?rng?=?cvRNG(-1);?? ????float?A[stateNum][stateNum]?={?? ????????1,0,1,0,?? ????????0,1,0,1,?? ????????0,0,1,0,?? ????????0,0,0,1?? ????};?? ?? ????memcpy(?kalman->transition_matrix->data.fl,A,sizeof(A));?? ????cvSetIdentity(kalman->measurement_matrix,cvRealScalar(1)?);?? ????cvSetIdentity(kalman->process_noise_cov,cvRealScalar(1e-5));?? ????cvSetIdentity(kalman->measurement_noise_cov,cvRealScalar(1e-1));?? ????cvSetIdentity(kalman->error_cov_post,cvRealScalar(1));?? ?????? ????cvRandArr(&rng,kalman->state_post,CV_RAND_UNI,cvRealScalar(0),cvRealScalar(winHeight>winWidth?winWidth:winHeight));?? ?? ????CvFont?font;?? ????cvInitFont(&font,CV_FONT_HERSHEY_SCRIPT_COMPLEX,1,1);?? ?? ????cvNamedWindow("kalman");?? ????cvSetMouseCallback("kalman",mouseEvent);?? ????IplImage*?img=cvCreateImage(cvSize(winWidth,winHeight),8,3);?? ????while?(1){?? ?????????? ????????const?CvMat*?prediction=cvKalmanPredict(kalman,0);?? ????????CvPoint?predict_pt=cvPoint((int)prediction->data.fl[0],(int)prediction->data.fl[1]);?? ?? ?????????? ????????measurement->data.fl[0]=(float)mousePosition.x;?? ????????measurement->data.fl[1]=(float)mousePosition.y;?? ?? ?????????? ????????cvKalmanCorrect(?kalman,?measurement?);??????? ?? ?????????? ????????cvSet(img,cvScalar(255,255,255,0));?? ????????cvCircle(img,predict_pt,5,CV_RGB(0,255,0),3);?? ????????cvCircle(img,mousePosition,5,CV_RGB(255,0,0),3);?? ????????char?buf[256];?? ????????sprintf_s(buf,256,"predicted?position:(%3d,%3d)",predict_pt.x,predict_pt.y);?? ????????cvPutText(img,buf,cvPoint(10,30),&font,CV_RGB(0,0,0));?? ????????sprintf_s(buf,256,"current?position?:(%3d,%3d)",mousePosition.x,mousePosition.y);?? ????????cvPutText(img,buf,cvPoint(10,60),&font,CV_RGB(0,0,0));?? ?????????? ????????cvShowImage("kalman",?img);?? ????????int?key=cvWaitKey(3);?? ????????if?(key==27){?? ????????????break;????? ????????}?? ????}???????? ?? ????cvReleaseImage(&img);?? ????cvReleaseKalman(&kalman);?? ????return?0;?? }??
?
kalman filter 視頻演示:
http://v.youku.com/v_show/id_XMjU4MzEyODky.html
?
demo snapshot:
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀
總結
以上是生活随笔為你收集整理的kalman 滤波 演示与opencv代码的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。