日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

kalman 滤波 演示与opencv代码

發布時間:2025/7/25 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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]?={//transition?matrix??
  • ????????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]?={//transition?matrix??
  • ????????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);??
  • ??
  • //mouse?event?callback??
  • void?mouseEvent(int?event,?int?x,?int?y,?int?flags,?void?*param?)??
  • {??
  • ????if?(event==CV_EVENT_MOUSEMOVE)?{??
  • ????????mousePosition=cvPoint(x,y);??
  • ????}??
  • }??
  • ??
  • int?main?(void)??
  • {??
  • ????//1.kalman?filter?setup??
  • ????const?int?stateNum=4;??
  • ????const?int?measureNum=2;??
  • ????CvKalman*?kalman?=?cvCreateKalman(?stateNum,?measureNum,?0?);//state(x,y,detaX,detaY)??
  • ????CvMat*?process_noise?=?cvCreateMat(?stateNum,?1,?CV_32FC1?);??
  • ????CvMat*?measurement?=?cvCreateMat(?measureNum,?1,?CV_32FC1?);//measurement(x,y)??
  • ????CvRNG?rng?=?cvRNG(-1);??
  • ????float?A[stateNum][stateNum]?={//transition?matrix??
  • ????????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));??
  • ????//initialize?post?state?of?kalman?filter?at?random??
  • ????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){??
  • ????????//2.kalman?prediction??
  • ????????const?CvMat*?prediction=cvKalmanPredict(kalman,0);??
  • ????????CvPoint?predict_pt=cvPoint((int)prediction->data.fl[0],(int)prediction->data.fl[1]);??
  • ??
  • ????????//3.update?measurement??
  • ????????measurement->data.fl[0]=(float)mousePosition.x;??
  • ????????measurement->data.fl[1]=(float)mousePosition.y;??
  • ??
  • ????????//4.update??
  • ????????cvKalmanCorrect(?kalman,?measurement?);???????
  • ??
  • ????????//draw???
  • ????????cvSet(img,cvScalar(255,255,255,0));??
  • ????????cvCircle(img,predict_pt,5,CV_RGB(0,255,0),3);//predicted?point?with?green??
  • ????????cvCircle(img,mousePosition,5,CV_RGB(255,0,0),3);//current?position?with?red??
  • ????????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){//esc?????
  • ????????????break;?????
  • ????????}??
  • ????}????????
  • ??
  • ????cvReleaseImage(&img);??
  • ????cvReleaseKalman(&kalman);??
  • ????return?0;??
  • }??
  • ?

    kalman filter 視頻演示:

    http://v.youku.com/v_show/id_XMjU4MzEyODky.html

    ?

    demo snapshot:

    《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

    總結

    以上是生活随笔為你收集整理的kalman 滤波 演示与opencv代码的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。