kalman.cpp
上传用户:banwdc
上传日期:2016-06-25
资源大小:2871k
文件大小:4k
源码类别:

OpenCV

开发平台:

Visual C++

  1. #include "cv.h"
  2. #include "highgui.h"
  3. #include <math.h>
  4. int main(int argc, char** argv)
  5. {
  6.     /* A matrix data */
  7.     const float A[] = { 1, 1, 0, 1 };
  8.     IplImage* img = cvCreateImage( cvSize(500,500), 8, 3 );
  9.     CvKalman* kalman = cvCreateKalman( 2, 1, 0 );
  10.     /* state is (phi, delta_phi) - angle and angle increment */
  11.     CvMat* state = cvCreateMat( 2, 1, CV_32FC1 );
  12.     CvMat* process_noise = cvCreateMat( 2, 1, CV_32FC1 );
  13.     /* only phi (angle) is measured */
  14.     CvMat* measurement = cvCreateMat( 1, 1, CV_32FC1 );
  15.     CvRandState rng;
  16.     int code = -1;
  17.     cvRandInit( &rng, 0, 1, -1, CV_RAND_UNI );
  18.     cvZero( measurement );
  19.     cvNamedWindow( "Kalman", 1 );
  20.     for(;;)
  21.     {
  22.         cvRandSetRange( &rng, 0, 0.1, 0 );
  23.         rng.disttype = CV_RAND_NORMAL;
  24.         cvRand( &rng, state );
  25.         memcpy( kalman->transition_matrix->data.fl, A, sizeof(A));
  26.         cvSetIdentity( kalman->measurement_matrix, cvRealScalar(1) );
  27.         cvSetIdentity( kalman->process_noise_cov, cvRealScalar(1e-5) );
  28.         cvSetIdentity( kalman->measurement_noise_cov, cvRealScalar(1e-1) );
  29.         cvSetIdentity( kalman->error_cov_post, cvRealScalar(1));
  30.         /* choose random initial state */
  31.         cvRand( &rng, kalman->state_post );
  32.         rng.disttype = CV_RAND_NORMAL;
  33.         for(;;)
  34.         {
  35.             #define calc_point(angle)                                      
  36.                 cvPoint( cvRound(img->width/2 + img->width/3*cos(angle)),  
  37.                          cvRound(img->height/2 - img->width/3*sin(angle)))
  38.             float state_angle = state->data.fl[0];
  39.             CvPoint state_pt = calc_point(state_angle);
  40.             /* predict point position */
  41.             const CvMat* prediction = cvKalmanPredict( kalman, 0 );
  42.             float predict_angle = prediction->data.fl[0];
  43.             CvPoint predict_pt = calc_point(predict_angle);
  44.             float measurement_angle;
  45.             CvPoint measurement_pt;
  46. cvRandSetRange( &rng, 0, 
  47. sqrt(kalman->measurement_noise_cov->data.fl[0]), 0 );
  48.             cvRand( &rng, measurement );
  49.             /* generate measurement */
  50. cvMatMulAdd( kalman->measurement_matrix, 
  51. state, measurement, measurement );
  52.             measurement_angle = measurement->data.fl[0];
  53.             measurement_pt = calc_point(measurement_angle);
  54.             /* plot points */
  55.             #define draw_cross( center, color, d )                                 
  56.                 cvLine( img, cvPoint( center.x - d, center.y - d ),                
  57.                              cvPoint( center.x + d, center.y + d ), color, 1, 0 ); 
  58.                 cvLine( img, cvPoint( center.x + d, center.y - d ),                
  59.                              cvPoint( center.x - d, center.y + d ), color, 1, 0 )
  60.             cvZero( img );
  61.             draw_cross( state_pt, CV_RGB(255,255,255), 3 );
  62.             draw_cross( measurement_pt, CV_RGB(255,0,0), 3 );
  63.             draw_cross( predict_pt, CV_RGB(0,255,0), 3 );
  64.             cvLine( img, state_pt, predict_pt, CV_RGB(255,255,0), 3, 0 );
  65.             /* adjust Kalman filter state */
  66.             cvKalmanCorrect( kalman, measurement );
  67.             cvRandSetRange( &rng, 0, sqrt(kalman->process_noise_cov->data.fl[0]), 0 );
  68.             cvRand( &rng, process_noise );
  69.             cvMatMulAdd( kalman->transition_matrix, state, process_noise, state );
  70.             cvShowImage( "Kalman", img );
  71.             code = cvWaitKey( 100 );
  72.             if( code > 0 ) /* break current simulation by pressing a key */
  73.                 break;
  74.         }
  75.         if( code == 27 ) /* exit by ESCAPE */
  76.             break;
  77.     }
  78.     return 0;
  79. }