Чувствительна ли оценка позы камеры с помощью SOLVEPNP_EPNP к выбросам, и можно ли это исправить? - PullRequest
0 голосов
/ 23 июня 2019

Мне нужно выполнить задание, в котором я должен сравнить функцию solvePnP(), используемую с SOLVEPNP_EPNP и solvePnPRansac(), используемую с SOLVEPNP_ITERATIVE.Цель состоит в том, чтобы вычислить деформированное изображение из входного изображения.

Для этого я получаю входное изображение RGB, то же самое изображение, что и информационное изображение глубиной 16 бит, внутренние характеристики камеры и список точек совпадения характеристик между данным изображением и искомым искривленным изображением (которое являетсята же сцена с другой точки зрения.

Вот как я проделал эту задачу до сих пор:

  1. Рассчитать список точек 3D-объекта, сформировать изображение глубины и внутренние компоненты, которые соответствуютк списку совпадений объектов.
  2. используйте solvePnP() и solvePnPRansac() с соответствующими алгоритмами, где вычисленные точки трехмерного объекта и точки совпадения объектов полученного изображения являются входными данными. В результате я получаювращение и вектор перевода для обоих методов.
  3. В качестве проверки работоспособности я вычисляю среднюю ошибку перепроецирования, используя projectPoints() для всех точек совпадения объектов и сравнивая полученные проецируемые точки с точками совпадения объектов полученного изображения.
  4. Наконец, я вычисляю точки 3D-объекта для каждого пикселявходное изображение и снова проецируйте их, используя вектор поворота и перемещения из предыдущего.Каждая проецируемая точка получит цвет от соответствующего пикселя во входном изображении, что приведет к окончательному искаженному изображению.

Это мои входные данные: enter image description here enter image description here

Используя описанные выше шаги, я получаю следующий вывод с RansacМетод: enter image description here Это похоже на эталонное решение, которое я имею, так что это должно быть в основном правильно.Однако при использовании метода solvePnP() с использованием SOLVEPNP_EPNP результирующие векторы вращения и перемещения выглядят так, что не имеет никакого смысла:

================ solvePnP с использованием результатов SOVLEPNP_EPNP: ===============

Вращение: [-4.3160208e + 08;-4.3160208e + 08;-4.3160208e + 08]

Перевод: [-4.3160208e + 08;-4.3160208e + 08;-4.3160208e + 08]

В листе назначения указано, что в списке совпадений объектов содержатся некоторые несоответствия, поэтому в основном это выбросы.Насколько я знаю, Ransac лучше справляется с выбросами, однако может ли это быть причиной столь странных результатов для другого метода?Я ожидал каких-то аномалий, но это совершенно неправильно, и полученное изображение полностью черное, так как внутри области изображения нет точек.

Может быть, кто-то может указать мне правильное направление.

1 Ответ

0 голосов
/ 25 июня 2019

ОК, я могу решить проблему. Я заранее использовал float для всех вычислений (точки 3D-объектов, совпадения, ...) и попытался изменить все на double - все получилось.

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

Странно то, что в документации OpenCV по solvePnP() гласит, что vector<Point3f> и vector<Point2f> могут быть переданы в качестве аргументов для точек объекта и точек изображения соответственно.

...