opencv Kalman фильтрует ошибку отслеживания нескольких объектов

Я пытался работать над отслеживанием нескольких объектов с помощью фильтра Калмана. Вот мой код,

for (int i =0; i<vGlobal.size(); i++) // Vector of objects of interest
    {
        cv::Point pTemp = cv::Point(vGlobal[i].iX, vGlobal[i].iY);
        cv::KalmanFilter kTempKF(4,2,0);
        kTempKF.statePre.at<floatt>(0) = pTemp.x;
        kTempKF.statePre.at<float>(1) = pTemp.y;
        kTempKF.statePre.at<float>(2) = 0;
        kTempKF.statePre.at<float>(3) = 0;

        kTempKF.transitionMatrix = *(cv::Mat_<float>(4,4)<< 1,0,1,0,  0,1,0,1,  0,0,1,0,  0,0,0,1);
        cv::setIdentity(kTempKF.measurementMatrix);
        cv::setIdentity(kTempKF.processNoiseCov, cv::Scalar::all(1e-4));            
        cv::setIdentity(kTempKF.measurementNoiseCov, cv::Scalar::all(10));
        cv::setIdentity(kTempKF.errorCovPost, cv::Scalar::all(.1));
        vKalmanFilters.push_back(kTempKF);  
    }

Я использую векторные фильтры Калмана для отслеживания каждого из моих объектов. Я сделал инициализацию фильтров, как указано выше. Теперь я пытаюсь работать с предсказанием и измерением, как показано в приведенном ниже коде.

 for (int i=0; i<vKalmanFilters.size();i++)
    {
        cv::Mat mPrediction = vKalmanFilters[i].predict(); 

        cv::Point pPredict(mPrediction.at<float>(0), mPrediction.at<float>(1));
        mMeasurement(0) = vGlobal[i].iX;
        mMeasurement(1) = vGlobal[i].iY;


        cv::Mat mEstimated;


            mEstimated = vKalmanFilters[i].correct(mPrediction); // Run time Error occurs here


     }

Когда я пытаюсь запустить эту программу, я получаю ошибку времени выполнения в правильном (предсказание)

  OpenCV Error: Assertion failed (C.type() == type && (((flags&GEMM_3_T) == 0 && C.rows == d_size.height && C.cols == d_size.width) || ((flags&GEMM_3_T) != 0 && C.rows == d_size.width && C.cols == d_size.height))) in gemm, file /build/buildd/opencv-2.4.8+dfsg1/modules/core/src/matmul.cpp, line 741
 terminate called after throwing an instance of 'cv::Exception'
 what():  /build/buildd/opencv-2.4.8+dfsg1/modules/core/src/matmul.cpp:741: error: (-215) C.type() == type && (((flags&GEMM_3_T) == 0 && C.rows == d_size.height && C.cols == d_size.width) || ((flags&GEMM_3_T) != 0 && C.rows == d_size.width && C.cols == d_size.height)) in function gemm

Я все еще новичок в фильтре Калмана. Ошибка возникает в точке предсказания. Мой подход совершенно неверен? Пожалуйста, кто-нибудь объясните, где я ошибаюсь.


person Karthik_elan    schedule 28.01.2016    source источник
comment
Матрицы должны быть float (CV_32F) или double (CV_64F), а не int   -  person Berriel    schedule 28.01.2016
comment
@Berriel: Да, это сработало. Но теперь (как недавно отредактировано) на правильном (прогнозируемом) шаге возникает другая ошибка времени выполнения, которую я добавил сейчас.   -  person Karthik_elan    schedule 28.01.2016


Ответы (1)


Вы должны использовать mMeasurement (матрица 2x1) вместо mPrediction (матрица 4x1) в этап исправления:

mEstimated = vKalmanFilters[i].correct(mMeasurement);

Учитывая, что вы сделали:

cv::KalmanFilter kTempKF(4,2,0);
// 4 dynamic params <-- your state, e.g. [x y dx dy]
// 2 measurements params <-- your mMeasurement [x y]
person Berriel    schedule 28.01.2016
comment
Как я могу использовать предсказание тогда? Я думал, что Prediction также должен давать матрицу 2x1. Мне сказали, что если нет измерения, то предсказание будет решением. Таким образом, предсказание также дает такое же значение, как и измерение. Как получить прогнозируемые значения, если нет значений измерений? Это мой вопрос. - person Karthik_elan; 29.01.2016
comment
Если этот ответ решает вашу проблему, пожалуйста, примите его или поддержите его. Что касается вашего сомнения, KalmanFilter использует измерение на этапе коррекции, которое обновляет прогнозируемое состояние на основе этого измерения. В случае отсутствия измерения, решать вам. Иногда люди используют последнее предсказанное состояние для correct(), но прежде чем делать это, я советую вам понять, что происходит на самом деле, математически. Кроме того, в этом случае состояние 4x1, и вам просто нужно использовать первые 2 в качестве measurement. - person Berriel; 29.01.2016
comment
привет, это не работает для меня. Я получаю неправильные оценочные значения. Однако, если я объявляю объект KalmanFilter глобально, я получаю правильное оценочное значение, и это тоже, если у меня есть только один блоб. Если у меня есть два BLOB-объекта, я получаю два одинаковых оценочных значения в центре обоих BLOB-объектов. Как мне сделать так, чтобы оценочные значения следовали за их соответствующим блобом? Не могли бы вы мне помочь. - person MaheshKumar; 02.12.2016