• 卡尔曼


    #if !defined(AFX_KALMAN_H__ED3D740F_01D2_4616_8B74_8BF57636F2C0__INCLUDED_)
    #define AFX_KALMAN_H__ED3D740F_01D2_4616_8B74_8BF57636F2C0__INCLUDED_
    #if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000
    #include 
    <math.h>
    #include 
    "cv.h"
    class kalman  
    {
    public:
     
    void init_kalman(int x,int xv,int y,int yv);
     CvKalman
    * cvkalman;
     CvMat
    * state; 
     CvMat
    * process_noise;
     CvMat
    * measurement;
     
    const CvMat* prediction;
     CvPoint2D32f get_predict(
    float x, float y);
     kalman(
    int x=0,int xv=0,int y=0,int yv=0);
     
    //virtual ~kalman();

    }
    ;
    #endif // !defined(AFX_KALMAN_H__ED3D740F_01D2_4616_8B74_8BF57636F2C0__INCLUDED_)
    ============================kalman.cpp================================
    #include 
    "kalman.h"
    #include 
    <stdio.h>

    /* tester de printer toutes les valeurs des vecteurs*/
    /* tester de changer les matrices du noises */
    /* replace state by cvkalman->state_post ??? */

    CvRandState rng;
    const double T = 0.1;
    kalman::kalman(
    int x,int xv,int y,int yv)
    {     
        cvkalman 
    = cvCreateKalman( 440 );
        state 
    = cvCreateMat( 41, CV_32FC1 );
        process_noise 
    = cvCreateMat( 41, CV_32FC1 );
        measurement 
    = cvCreateMat( 41, CV_32FC1 );
        
    int code = -1;
        
        
    /* create matrix data */
         
    const float A[] = 
       
    1, T, 00,
       
    0100,
       
    001, T,
       
    0001
      }
    ;
         
         
    const float H[] = 
        
    1000,
        
    0000,
       
    0010,
       
    0000
      }
    ;
           
         
    const float P[] = {
        pow(
    320,2), pow(320,2)/T, 00,
       pow(
    320,2)/T, pow(320,2)/pow(T,2), 00,
       
    00, pow(240,2), pow(240,2)/T,
       
    00, pow(240,2)/T, pow(240,2)/pow(T,2)
        }
    ;
         
    const float Q[] = {
       pow(T,
    3)/3, pow(T,2)/200,
       pow(T,
    2)/2, T, 00,
       
    00, pow(T,3)/3, pow(T,2)/2,
       
    00, pow(T,2)/2, T
       }
    ;
       
         
    const float R[] = {
       
    1000,
       
    0000,
       
    0010,
       
    0000
       }
    ;
       
        
        cvRandInit( 
    &rng, 01-1, CV_RAND_UNI );
        cvZero( measurement );
        
        cvRandSetRange( 
    &rng, 00.10 );
        rng.disttype 
    = CV_RAND_NORMAL;
        cvRand( 
    &rng, state );
        memcpy( cvkalman
    ->transition_matrix->data.fl, A, sizeof(A));
        memcpy( cvkalman
    ->measurement_matrix->data.fl, H, sizeof(H));
        memcpy( cvkalman
    ->process_noise_cov->data.fl, Q, sizeof(Q));
        memcpy( cvkalman
    ->error_cov_post->data.fl, P, sizeof(P));
        memcpy( cvkalman
    ->measurement_noise_cov->data.fl, R, sizeof(R));
        
    //cvSetIdentity( cvkalman->process_noise_cov, cvRealScalar(1e-5) );    
        
    //cvSetIdentity( cvkalman->error_cov_post, cvRealScalar(1));
     
    //cvSetIdentity( cvkalman->measurement_noise_cov, cvRealScalar(1e-1) );
        /* choose initial state */
        state
    ->data.fl[0]=x;
        state
    ->data.fl[1]=xv;
        state
    ->data.fl[2]=y;
        state
    ->data.fl[3]=yv;
        cvkalman
    ->state_post->data.fl[0]=x;
        cvkalman
    ->state_post->data.fl[1]=xv;
        cvkalman
    ->state_post->data.fl[2]=y;
        cvkalman
    ->state_post->data.fl[3]=yv;
     cvRandSetRange( 
    &rng, 0, sqrt(cvkalman->process_noise_cov->data.fl[0]), 0 );
        cvRand( 
    &rng, process_noise );

        }

         
    CvPoint2D32f kalman::get_predict(
    float x, float y){
        
        
    /* update state with current position */
        state
    ->data.fl[0]=x;
        state
    ->data.fl[2]=y;
        
        
    /* predict point position */
        
    /* x'k=A鈥k+B鈥k
           P'k=A鈥k-1*AT + Q 
    */

        cvRandSetRange( 
    &rng, 0, sqrt(cvkalman->measurement_noise_cov->data.fl[0]), 0 );
        cvRand( 
    &rng, measurement );
        
         
    /* xk=A?xk-1+B?uk+wk */
        cvMatMulAdd( cvkalman
    ->transition_matrix, state, process_noise, cvkalman->state_post );
        
        
    /* zk=H?xk+vk */
        cvMatMulAdd( cvkalman
    ->measurement_matrix, cvkalman->state_post, measurement, measurement );
        
        
    /* adjust Kalman filter state */
        
    /* Kk=P'k鈥T鈥?H鈥'k鈥T+R)-1
           xk=x'k+Kk鈥?zk-H鈥'k)
           Pk=(I-Kk鈥)鈥'k 
    */

        cvKalmanCorrect( cvkalman, measurement );
        
    float measured_value_x = measurement->data.fl[0];
        
    float measured_value_y = measurement->data.fl[2];
        
     
    const CvMat* prediction = cvKalmanPredict( cvkalman, 0 );
        
    float predict_value_x = prediction->data.fl[0];
        
    float predict_value_y = prediction->data.fl[2];
        
    return(cvPoint2D32f(predict_value_x,predict_value_y));
    }

    void kalman::init_kalman(int x,int xv,int y,int yv)
    {
     state
    ->data.fl[0]=x;
        state
    ->data.fl[1]=xv;
        state
    ->data.fl[2]=y;
        state
    ->data.fl[3]=yv;
        cvkalman
    ->state_post->data.fl[0]=x;
        cvkalman
    ->state_post->data.fl[1]=xv;
        cvkalman
    ->state_post->data.fl[2]=y;
        cvkalman
    ->state_post->data.fl[3]=yv;
    }


  • 相关阅读:
    SpringBoot 动态修改定时任务频率
    window三种程序自启动方式
    vbs与bat脚本实现本地jdk版本自动切换
    java连接sqlserver数据库
    java连接Access数据库
    Java如何连接Access数据库(两种方式实例代码)
    java连接access数据库的三种方式以及远程连接
    Linux下实现MySQL数据库每天定时自动备份
    解决谷歌浏览器http链接自动跳转到https的问题
    2021年第一天
  • 原文地址:https://www.cnblogs.com/wqj1212/p/1011432.html
Copyright © 2020-2023  润新知