2

Я создаю приложение 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)); 

Эта модель практически не корректирует мое измеренное значение

Сейчас мои вопросы:

  1. Является ли фильтр Калмана подходящим для моего сценария? Это даст мне лучшие результаты?
  2. Если да, то чего не хватает? Я моделирую его правильно? Вместо этого создадим 4 фильтра для четырех точек прямоугольника, должен ли я его моделировать каким-либо другим способом (например, взять 10 самых сильных совпадений на основе расстояния и использовать их в качестве входа в фильтр)
  3. Если фильтр Калмана не подходит, что еще я могу сделать для обеспечения большей стабильности оценочной гомографии?

Любая помощь будет высоко оценена. Спасибо.

+0

Подсказка: вы НЕ отслеживаете функции orb, вы обнаруживаете их в каждом кадре. Я бы лучше применил фильтр к * выходу * метода 'findHomography' для фильтрации фактической позиции камеры. Моделирование для этого было бы более сложным, так как есть некоторые нелинейности, но выполнимые. Вы можете начать [здесь] (http://campar.in.tum.de/Chair/KalmanFilter). – Xocoatzin

ответ

1

Этот вопрос плохо озаглавлен и после прочтения вашего объяснения, что вы действительно спрашиваете: «Почему мой фильтр OpenCV Kalman все еще оставляет много шума? "

В любом случае ваши ответы:

  1. Да Калмана работает для сценария
  2. Вы используете это неправильно
  3. Изменить: KF.processNoiseCov, Вы можете получить код здесь: Opencv kalman filter prediction without new observtion есть хороший . линия объясняя это

См:

setIdentity(KF.processNoiseCov, Scalar::all(.005)); //adjust this for faster convergence - but higher noise 

Для того, что я вижу, у вас есть самое общее представление об этом, вы можете перейти к наивному подходу и использовать четыре 2D фильтра Калмана, для этого вы можете использовать код здесь:. Он будет работать, оттуда расти и адаптироваться, пока вы не поймете лучшего понимания.

После этого вы можете более точно его подобрать к своей проблеме, или вы можете использовать четыре фильтра, нет «идеальной» реализации, поэтому, если это сработает для вас, просто пойдите для этого.