Ошибка инициализации фильтра Калмана OpenCV

0

Я хочу отслеживать 30 точек изображения и хочу стабилизировать отслеживание с помощью фильтра Kalman в библиотеке OpenCV. Я сделал это раньше для одной точки и смог использовать положение и скорость точки как состояния. Затем, за 30 очков, я решил создать 30 фильтров Kalman, по одному для каждой точки и поместив их в массив. Однако, я получил ошибку утверждения.

Это правильный/лучший способ отслеживать эти 30 точек на изображении? Есть ли лучшие способы сделать это?

Мой код ниже. Проблема возникает в строке StatePre.

vector<KalmanFilter> ijvEdgeKF(30);

for(int i = 0; i < 30; i++){
    Point temp = calcEndPoint(ijv,170,i*360/30); //Calculates initial point
    ijvEdgeKF[i].statePre.at<float>(0) = temp.x; //State x
    ijvEdgeKF[i].statePre.at<float>(1) = temp.y; //State y
    ijvEdgeKF[i].statePre.at<float>(2) = 0; //State Vx
    ijvEdgeKF[i].statePre.at<float>(3) = 0; //State Vy

    ijvEdgeKF[i].transitionMatrix = *(Mat_<float>(4, 4) << 1,0,0,0,   0,1,0,0,  0,0,1,0,  0,0,0,1);
    setIdentity(ijvEdgeKF[i].measurementMatrix);
    setIdentity(ijvEdgeKF[i].processNoiseCov, Scalar::all(1e-4));
    setIdentity(ijvEdgeKF[i].measurementNoiseCov, Scalar::all(1e-1));
    setIdentity(ijvEdgeKF[i].errorCovPost, Scalar::all(.1));
}

Решаемые. Проблема была в инициализации KalmanFilter. Я не инициализировал фильтр в массивах, поэтому вот решение:

vector<KalmanFilter> ijvEdgeKF;
ijvEdgeKF.clear();

for(int i = 0; i < 30; i++){
    Point temp = calcEndPoint(ijv,170,i*360/30); //Calculates initial point
    KalmanFilter tempKF(4,2,0);
    tempKF.statePre.at<float>(0) = temp.x; //State x
    tempKF.statePre.at<float>(1) = temp.y; //State y
    tempKF.statePre.at<float>(2) = 0; //State Vx
    tempKF.statePre.at<float>(3) = 0; //State Vy

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

Однако есть еще один вопрос, является ли это единственным способом отслеживания нескольких точек изображения или есть лучший способ?

  • 0
    а ошибка есть?
  • 0
    Ошибка OpenCV: утверждение не выполнено (dims <= 2 && data && (unsigned) i0 <(unsigned) (size.p [0] * size.p [1]) && elemSize () == (((((DataType <_Tp > :: type) & ((512 - 1) << 3)) >> 3) + 1) << ((((sizeof (size_t) / 4 + 1) * 16384 | 0x3a50) >> ((DataType < _Tp> :: type) & ((1 << 3) - 1)) * 2) & 3))) в неизвестной функции, файл c: \ opencv \ build \ include \ opencv2 \ core \ mat.hpp, строка 569
Показать ещё 1 комментарий
Теги:
opencv

1 ответ

0
Лучший ответ

вы не инициализируете свои KalmanFilters правильно, поэтому StatePre Mat пуст.

for(int i = 0; i < 30; i++){
    ijvEdgeKF[i].init(4,4);  // int dynamParams, int measureParams
    ijvEdgeKF[i].statePre.at<float>(0) = 3; //State x
    ...
  • 0
    спасибо, просто сам разобрался несколько минут назад.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню