В настоящее время я использую OpenCV для работы с оценкой позы, в которой я являюсь точкой триангуляции между парами для реконструкции и оценки масштабного коэффициента. Я столкнулся с какой-то странной проблемой, работая над этим, особенно в opencv-функциях restorePose() и triangulatePoints().Странный вопрос со стерео триангуляцией: TWO valid solutions
Скажем, у меня есть камера 1 и камера 2, расположенная на расстоянии X, с кулачком 1 (0,0,0) и cam2 справа от нее (положительное X). У меня есть два массива points1 и points2, которые соответствуют характеристикам между двумя изображениями. В соответствии с документацией и кодом OpenCV я отметил два момента:
- recoverPose() предполагает, что точки 1 относятся к камере в точке (0,0,0).
triangulatePoints() вызывается дважды: один из recoverPose(), чтобы сообщить нам, какие из комбинаций/т четыре R справедливо, а затем снова из моего кода, и документации говорит:
cv::triangulatePoints(P1, P2, points1, points2, points3D) : points1 -> P1 and points2 -> P2.
Следовательно, как и в случае recoverPose(), можно с уверенностью предположить, что P1 является [I | 0], а P2 - [R | t].
Что я на самом деле нашел: это не работает. Хотя моя камера 1 находится в 0,0,0 и Camera2 находится на 1,0,0 (1 будучи до масштаба), получается единственно правильной конфигурации, если я бегу
recoverPose(E, points2, points1...)
triangulatePoints([I|0], [R|t], points2, points1, pts3D)
, который должен быть неправильным, так как points2 является множеством из R | t, а не точками 1. Я проверил пару изображений в моей комнате, где после триангуляции есть три заметных объекта: монитор и два плаката на стене позади него. Вот облака точек в результате триангуляции (извините MS Paint)
Если я делаю это предписанный путь в OpenCV в: (стендовые точки рассредоточены в пространстве, странный результат)
Если я сделать это мой (так?) способ:
Может кто-нибудь поделиться своим мнением о том, что здесь происходит? Технически оба решения действительны, потому что все точки падают перед обеими камерами: я не знал, что выбрать, пока я не покажу его как pointcloud. Я что-то делаю неправильно, или это ошибка в документации? Я не настолько осведомлен о теории компьютерного видения, поэтому, возможно, мне не хватает чего-то фундаментального здесь. Спасибо за ваше время!
Вы когда-нибудь это выясняли? Какую версию (именно) OpenCV вы используете? –
Честно говоря, нет. Я просто пошел с методом, который дал правильные результаты. Я использую 2.4.11 в C++. – HighVoltage