Я хочу отслеживать 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);
}
Однако есть еще один вопрос, является ли это единственным способом отслеживания нескольких точек изображения или есть лучший способ?
вы не инициализируете свои 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
...