我想实现一个卡尔曼滤波器来跟踪一个点,这是我的代码

    public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
    mRgba = inputFrame.rgba();
    mGray = inputFrame.gray();

    switch (viewMode) {

    case VIEW_MODE_ColorDetect:


            /**
             *
             * some code for color detect
             *
             */

            int ObjectCenterX = (int)((mboundingRect.tl().x + mboundingRect.br().x) / 2);
            int ObjectCenterY = (int)((mboundingRect.tl().y + mboundingRect.br().y) / 2);

            //get the object center point , and I whant to track it by kalman filter.
            Core.circle(mRgba, new Point(ObjectCenterX, ObjectCenterY), 5, ColorGreen, 2);


            /***********************************************Kalman************************************************************/
            try {
                Mat ObjectPoint = new Mat(1, 2, CvType.CV_32F);
                int[] PreObjectCenter = {ObjectCenterX, ObjectCenterY};
                ObjectPoint.put(0, 0, PreObjectCenter[0]);
                ObjectPoint.put(0, 1, PreObjectCenter[1]);
                ObjectPoint = myKalmanFilter(ObjectPoint);

                /**Question 2: How to get corrected point from Mat?**/

            } catch (Exception e) {
                Log.e("In camera fram: ", e.toString());
            }
            /*****************************************************************************************************************/

        }
     return mRgba;



return mRgba;
}

private Mat myKalmanFilter(Mat objectPoint){
    KalmanFilter KF = new KalmanFilter();
    try {
        KF.predict(objectPoint);

        KF.correct(objectPoint);
    } catch (Exception e) {
        Log.e("myKalmanFilter: ", e.toString());
    }

    return objectPoint;
}

我有2个问题,第1题。我收到此代码以下错误:



Q2。修改了可以工作的代码后,如何从Mat中获取x和y点?

编辑:
我仍然不知道如何设置KalmanFilter尺寸,我像这样设置private KalmanFilter KF = new KalmanFilter(1, 2, 16, CvType.CV_32F);和eclipse show

最佳答案

  • 请不要为每个预测/更正创建新的KalmanFilter,它必须在程序运行的整个过程中保持状态。
  • ,您需要创建具有正确尺寸的KalmanFilter,以使测量尺寸为dynparamsize,调用空构造函数将产生上述错误。
  • KF.predict(objectPoint)将覆盖objectPoint中的内容,因此您要使用预测值而不是测量值进行校正。在那里使用2个不同的Mats,或反转预测/正确顺序
  • 不幸的是,opencv java包装器不允许您为Kalman过滤器设置statePre或Transition Mats。它的当前界面有点用。您将需要jni进行设置,或者使用javacv绑定(bind)(虽然陈旧,但至少可以更好地处理这一部分)
  • 08-18 20:11