kalman.cpp
上传用户:jsylhbnbhn
上传日期:2013-11-03
资源大小:119k
文件大小:4k
源码类别:

OpenCV

开发平台:

Visual C++

  1. #include "kalman.h"
  2. #include <stdio.h>
  3. /* tester de printer toutes les valeurs des vecteurs...*/
  4. /* tester de changer les matrices du noises */
  5. /* replace state by cvkalman->state_post ??? */
  6. CvRandState rng;
  7. const double T = 0.1;
  8. kalman::kalman(int x,int xv,int y,int yv)
  9. {
  10.     cvkalman = cvCreateKalman( 4, 4, 0 );
  11.     state = cvCreateMat( 4, 1, CV_32FC1 );
  12.     process_noise = cvCreateMat( 4, 1, CV_32FC1 );
  13.     measurement = cvCreateMat( 4, 1, CV_32FC1 );
  14.     int code = -1;
  15.     
  16.     /* create matrix data */
  17.      const float A[] = { 
  18. 1, T, 0, 0,
  19. 0, 1, 0, 0,
  20. 0, 0, 1, T,
  21. 0, 0, 0, 1
  22. };
  23.      const float H[] = { 
  24.   1, 0, 0, 0,
  25.   0, 0, 0, 0,
  26. 0, 0, 1, 0,
  27. 0, 0, 0, 0
  28. };
  29.      
  30.      const float P[] = {
  31.   pow(320,2), pow(320,2)/T, 0, 0,
  32. pow(320,2)/T, pow(320,2)/pow(T,2), 0, 0,
  33. 0, 0, pow(240,2), pow(240,2)/T,
  34. 0, 0, pow(240,2)/T, pow(240,2)/pow(T,2)
  35.   };
  36.      const float Q[] = {
  37. pow(T,3)/3, pow(T,2)/2, 0, 0,
  38. pow(T,2)/2, T, 0, 0,
  39. 0, 0, pow(T,3)/3, pow(T,2)/2,
  40. 0, 0, pow(T,2)/2, T
  41. };
  42.      const float R[] = {
  43. 1, 0, 0, 0,
  44. 0, 0, 0, 0,
  45. 0, 0, 1, 0,
  46. 0, 0, 0, 0
  47. };
  48.     
  49.     cvRandInit( &rng, 0, 1, -1, CV_RAND_UNI );
  50.     cvZero( measurement );
  51.     
  52.     cvRandSetRange( &rng, 0, 0.1, 0 );
  53.     rng.disttype = CV_RAND_NORMAL;
  54.     cvRand( &rng, state );
  55.     memcpy( cvkalman->transition_matrix->data.fl, A, sizeof(A));
  56.     memcpy( cvkalman->measurement_matrix->data.fl, H, sizeof(H));
  57.     memcpy( cvkalman->process_noise_cov->data.fl, Q, sizeof(Q));
  58.     memcpy( cvkalman->error_cov_post->data.fl, P, sizeof(P));
  59.     memcpy( cvkalman->measurement_noise_cov->data.fl, R, sizeof(R));
  60.     //cvSetIdentity( cvkalman->process_noise_cov, cvRealScalar(1e-5) );    
  61.     //cvSetIdentity( cvkalman->error_cov_post, cvRealScalar(1));
  62. //cvSetIdentity( cvkalman->measurement_noise_cov, cvRealScalar(1e-1) );
  63.     /* choose initial state */
  64.     state->data.fl[0]=x;
  65.     state->data.fl[1]=xv;
  66.     state->data.fl[2]=y;
  67.     state->data.fl[3]=yv;
  68.     cvkalman->state_post->data.fl[0]=x;
  69.     cvkalman->state_post->data.fl[1]=xv;
  70.     cvkalman->state_post->data.fl[2]=y;
  71.     cvkalman->state_post->data.fl[3]=yv;
  72. cvRandSetRange( &rng, 0, sqrt(cvkalman->process_noise_cov->data.fl[0]), 0 );
  73.     cvRand( &rng, process_noise );
  74.     }
  75.      
  76. CvPoint2D32f kalman::get_predict(float x, float y){
  77.     
  78.     /* update state with current position */
  79.     state->data.fl[0]=x;
  80.     state->data.fl[2]=y;
  81.     
  82.     /* predict point position */
  83.     /* x'k=A•xk+B•uk
  84.        P'k=A•Pk-1*AT + Q */
  85.     cvRandSetRange( &rng, 0, sqrt(cvkalman->measurement_noise_cov->data.fl[0]), 0 );
  86.     cvRand( &rng, measurement );
  87.     
  88.      /* xk=A?xk-1+B?uk+wk */
  89.     cvMatMulAdd( cvkalman->transition_matrix, state, process_noise, cvkalman->state_post );
  90.     
  91.     /* zk=H?xk+vk */
  92.     cvMatMulAdd( cvkalman->measurement_matrix, cvkalman->state_post, measurement, measurement );
  93.     
  94.     /* adjust Kalman filter state */
  95.     /* Kk=P'k•HT•(H•P'k•HT+R)-1
  96.        xk=x'k+Kk•(zk-H•x'k)
  97.        Pk=(I-Kk•H)•P'k */
  98.     cvKalmanCorrect( cvkalman, measurement );
  99.     float measured_value_x = measurement->data.fl[0];
  100.     float measured_value_y = measurement->data.fl[2];
  101.     
  102. const CvMat* prediction = cvKalmanPredict( cvkalman, 0 );
  103.     float predict_value_x = prediction->data.fl[0];
  104.     float predict_value_y = prediction->data.fl[2];
  105.     return(cvPoint2D32f(predict_value_x,predict_value_y));
  106. }
  107. void kalman::init_kalman(int x,int xv,int y,int yv)
  108. {
  109. state->data.fl[0]=x;
  110.     state->data.fl[1]=xv;
  111.     state->data.fl[2]=y;
  112.     state->data.fl[3]=yv;
  113.     cvkalman->state_post->data.fl[0]=x;
  114.     cvkalman->state_post->data.fl[1]=xv;
  115.     cvkalman->state_post->data.fl[2]=y;
  116.     cvkalman->state_post->data.fl[3]=yv;
  117. }