OpenCV RecoveryPose из существенной матрицы E

с Opencv 3.0 я получил основную матрицу с функцией:

      E = findEssentialMat(points2, points1, focal, pp, RANSAC, 0.999, 1.0, mask);

Глядя на значения маски, количество вставок действительно велико.

После того, как я использовал функцию restorePose:

      recoverPose(E, points2, points1, R, t, focal, pp, mask);

Но я заметил, что количество переданных вставок (глядя на маску) очень мало (часто нули).

У меня такой вопрос: есть ли способ получить больше вставок с помощью функции recoveryPose? Если нет, есть ли другой способ получить R и t (без использования функции restorePose)?

Большое спасибо!

1 ответ

Без более подробной информации судить о том, что происходит, действительно сложно. Основная задача, которую должен решить RecoverPose, - это выбрать между 4 различными решениями для перемещения и поворота с учетом существенной матричной оценки.

Шаги примерно следующие:

  • Оценка 4 возможных решений
  • Трехмерная триангуляция всех точек входа
  • Проверка хиральности: в основном проверка, находится ли триангулированная точка перед обеими камерами (положительная координата z для системы координат opencv)
  • Выберите решение и отметьте все промежуточные значения, не прошедшие проверку Cheirality, как выбросы.

Похоже, что во время проверки хиральности что-то пошло не так. На самом деле вы можете довольно легко реализовать RecoverPose самостоятельно. Вы можете проверить, как я это сделал, в моем текущем проекте (ищите DecomposeEssentialMat): https://github.com/makra89/Visual-Odometry-Cpp/blob/master/src/Utils/src/ImageProcessingUtils.cpp

Другие вопросы по тегам