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