Я создаю приложение AR, которое отслеживает функцию, вычисляет гомографию, а затем получает позу объекта из 3D-2D точечных соответствий и использует это для рендеринга любого 3D-объекта.Лучшая оценка гомографии с использованием фильтра Калмана?
Я выбираю определенную область для обнаружения объектов на своем исходном изображении (путем маскировки). а затем сопоставлять его с функциями, обнаруженными на последующих кадрах. Затем я фильтрую эти совпадения и оцениваю Гомографию области без маскировки.
Проблема заключается в оценке гомографии. Он отличается каждый раз (очень немного, но тем не менее, отличается). Эффект таков: даже при сохранении моей камеры, я получаю вибрирующий прямоугольник вокруг моей отслеживаемой области, которую я рисую, используя оценочную гомографию.
Я уже задал вопрос Unstable homography estimation using ORB и получил подтверждение факта, который я рассматривал (не пересчитывая свою гомографию, если положение области похоже на ее последнюю позицию).
Тем не менее, я недавно узнал об Калмановом фильтре, что дает более точную оценку позиции, объединив наши знания и знания с нашим наблюдением за измерениями.
Так, посмотрев на различных примерах (один, в частности, http://www.youtube.com/watch?v=GBYW1j9lC1I), я смоделировал фильтр Калмана (а 4, по одному для каждой точки rectanglular области) для моего сценария:
m_KF1.init(4, 2, 1);
setIdentity(m_KF2.transitionMatrix);
m_measurement1 = Mat::zeros(2,1,cv::DataType<float>::type);
m_KF1.statePre.setTo(0);
m_KF1.controlMatrix.setTo(0);
//initialzing filter
m_KF1.statePre.at<float>(0) = m_scene_corners[1].x; //the first reading
m_KF1.statePre.at<float>(1) = m_scene_corners[1].y;
m_KF1.statePre.at<float>(2) = 0;
m_KF1.statePre.at<float>(3) = 0;
setIdentity(m_KF1.measurementMatrix);
setIdentity(m_KF1.processNoiseCov,Scalar::all(.1)) //updated at every step
setIdentity(m_KF1.measurementNoiseCov, Scalar::all(4)); //assuming measurement error of
//not more than 2 pixels
setIdentity(m_KF1.errorCovPost, Scalar::all(.1));
4 состояния переменные (положение по х, у и скорость по х, у).
2 переменные измерения (положение в х, у)
1 переменных управления (ускорение)
следующие шаги на каждой итерации
//---First,the predicion phase , to update the internal variables-------//
// 'dt' is the time taken between the measurements
//Updating the transitionMatrix
m_KF1.transitionMatrix.at<float>(0,2) = dt;
m_KF1.transitionMatrix.at<float>(1,3) = dt;
//Updating the Control matrix
m_KF1.controlMatrix.at<float>(0,1) = (dt*dt)/2;
m_KF1.controlMatrix.at<float>(1,1) = (dt*dt)/2;
m_KF1.controlMatrix.at<float>(2,1) = dt;
m_KF1.controlMatrix.at<float>(3,1) = dt;
//Updating the processNoiseCovmatrix
m_KF1.processNoiseCov.at<float>(0,0) = (dt*dt*dt*dt)/4;
m_KF1.processNoiseCov.at<float>(0,2) = (dt*dt*dt)/2;
m_KF1.processNoiseCov.at<float>(1,1) = (dt*dt*dt*dt)/4;
m_KF1.processNoiseCov.at<float>(1,3) = (dt*dt*dt)/2;
m_KF1.processNoiseCov.at<float>(2,0) = (dt*dt*dt)/2;
m_KF1.processNoiseCov.at<float>(2,2) = dt*dt;
m_KF1.processNoiseCov.at<float>(3,1) = (dt*dt*dt)/2;
m_KF1.processNoiseCov.at<float>(3,3) = dt*dt;
Mat prediction1 = m_KF1.predict();
Point2f predictPt1(prediction1.at<float>(0),prediction1.at<float>(1));
// Get the measured corner
m_measurement1.at<float>(0,0) = scene_corners[0].x;
m_measurement1.at<float>(0,1) = scene_corners[0].y;
//----Then, the correction phase which uses the predicted value and our measured value
Mat estimated = m_KF1.correct(m_measurement1);
Point2f statePt1(estimated.at<float>(0),estimated.at<float>(1));
Эта модель практически не корректирует мое измеренное значение
Сейчас мои вопросы:
- Является ли фильтр Калмана подходящим для моего сценария? Это даст мне лучшие результаты?
- Если да, то чего не хватает? Я моделирую его правильно? Вместо этого создадим 4 фильтра для четырех точек прямоугольника, должен ли я его моделировать каким-либо другим способом (например, взять 10 самых сильных совпадений на основе расстояния и использовать их в качестве входа в фильтр)
- Если фильтр Калмана не подходит, что еще я могу сделать для обеспечения большей стабильности оценочной гомографии?
Любая помощь будет высоко оценена. Спасибо.
Подсказка: вы НЕ отслеживаете функции orb, вы обнаруживаете их в каждом кадре. Я бы лучше применил фильтр к * выходу * метода 'findHomography' для фильтрации фактической позиции камеры. Моделирование для этого было бы более сложным, так как есть некоторые нелинейности, но выполнимые. Вы можете начать [здесь] (http://campar.in.tum.de/Chair/KalmanFilter). – Xocoatzin