卡尔曼滤波器跟踪鼠标

卡尔曼滤波器跟踪鼠标

#include "stdafx.h"

//#include <cv.h>  
///#include <cxcore.h>  
//#include <highgui.h>  
#include "opencv2\opencv.hpp"  
#include <cmath>  
#include <vector>  
#include <iostream>  
using namespace std; 
using namespace cv;
  
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;  

}  

读取鼠标的点,然后用卡尔曼滤波器预估鼠标的位置,并做轨迹。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值