在OpenCV Java中实现卡尔曼滤波器

3
我是一个有用的助手,可以为你进行翻译。以下是需要翻译的内容:

我尝试在Java的OpenCV程序中实现卡尔曼滤波器。 我对OpenCV和Kalman滤波器都很新。 我在C ++中找到了一些示例(Java中没有太多),这是我迄今为止所拥有的:

初始化:

    //create kalman filter  
    KalmanFilter kalman = new KalmanFilter(4,2,0,CvType.CV_32F);  
    //set transition matrix
    float[] tM = { 1, 0, 1, 0, 
            0, 1, 0, 1,
            0, 0, 1, 0,
            0, 0, 0, 1 } ;
    Mat transitionMatrix=new Mat(4,4,CvType.CV_32F,new Scalar(0));
    transitionMatrix.put(0,0,tM);
    kalman.set_transitionMatrix(transitionMatrix);
    //set init measurement
    Mat measurementMatrix = new Mat (2,1, CvType.CV_32F);
    measurementMatrix.setTo(new Scalar(0));
    kalman.set_measurementMatrix(measurementMatrix);

    //Set state matrix
    Mat statePre = new Mat(4,1, CvType.CV_32F);
    statePre.put(1, 1, 300);
    statePre.put(2, 1, 200);
    statePre.put(3, 1, 0);
    statePre.put(4, 1, 0);
    kalman.set_statePre(statePre);


    //Process noise Covariance matrix
    Mat processNoiseCov=Mat.eye(4,4,CvType.CV_32F);
    processNoiseCov=processNoiseCov.mul(processNoiseCov,1e-1);
    kalman.set_processNoiseCov(processNoiseCov);

    //Measurement noise Covariance matrix: reliability on our first measurement
    Mat measurementNoiseCov=Mat.eye(4,4,CvType.CV_32F);
    measurementNoiseCov=measurementNoiseCov.mul(measurementNoiseCov,1e-1);
    kalman.set_measurementNoiseCov(measurementNoiseCov);

    Mat id2=Mat.eye(4,4,CvType.CV_32F);
    id2=id2.mul(id2,0.1);
    kalman.set_errorCovPost(id2);

针对每一帧视频:

    prediction= kalman.predict();
    predictPt.x = prediction.get(1,1)[0];
    predictPt.y = prediction.get(2,1)[0];

...新的测量方式...

   measurementMatrix.put(1, 1, center.x);
   measurementMatrix.put(2, 1, center.y);
   measPt.x=center.x;
   measPt.y=center.y;

   Mat estimated = kalman.correct(measurementMatrix);
   statePt.x=estimated.get(1, 1)[1];
   statePt.y= estimated.get(2, 1)[1];

问题是我得到了一个空的预测值,但我不知道为什么会出现这种情况。有人知道我的代码有哪些问题吗?非常感谢任何帮助!

谢谢!

1个回答

1
你得到了一个空预测,因为你既没有插入正确的元素,也没有访问正确的元素。
首先:
statePre.put(0, 1, 300); //statePre.put(1, 1, 300);
statePre.put(1, 1, 200); //statePre.put(2, 1, 200);
statePre.put(2, 1, 0); //statePre.put(3, 1, 0);
statePre.put(3, 1, 0); // statePre.put(4, 1, 0);

预测:

prediction= kalman.predict();
predictPt.x = prediction.get(0,0)[0]; //predictPt.x = prediction.get(1,1)[0];
predictPt.y = prediction.get(1,0)[0]; //predictPt.y = prediction.get(2,1)[0];

最后:

measurementMatrix.put(0, 0, center.x); // measurementMatrix.put(1, 1, center.x);
measurementMatrix.put(1, 0, center.y); //measurementMatrix.put(2, 1, center.y);
measPt.x=center.x;
measPt.y=center.y;

Mat estimated = kalman.correct(measurementMatrix);
statePt.x=estimated.get(0,0)[0];
statePt.y= estimated.get(1,0)[0];

此句话的英译中文为:

同时,你的measurementMatrix应该像这样

 Mat measurementMatrix = Mat.eye(2,4, CvType.CV_32F);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接