2015-08-24 5 views
1

В настоящее время я использую OpenCV для работы с оценкой позы, в которой я являюсь точкой триангуляции между парами для реконструкции и оценки масштабного коэффициента. Я столкнулся с какой-то странной проблемой, работая над этим, особенно в opencv-функциях restorePose() и triangulatePoints().Странный вопрос со стерео триангуляцией: TWO valid solutions

Скажем, у меня есть камера 1 и камера 2, расположенная на расстоянии X, с кулачком 1 (0,0,0) и cam2 справа от нее (положительное X). У меня есть два массива points1 и points2, которые соответствуют характеристикам между двумя изображениями. В соответствии с документацией и кодом OpenCV я отметил два момента:

  1. recoverPose() предполагает, что точки 1 относятся к камере в точке (0,0,0).
  2. 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 в: (стендовые точки рассредоточены в пространстве, странный результат)

Wrong

Если я сделать это мой (так?) способ:

Correct

Может кто-нибудь поделиться своим мнением о том, что здесь происходит? Технически оба решения действительны, потому что все точки падают перед обеими камерами: я не знал, что выбрать, пока я не покажу его как pointcloud. Я что-то делаю неправильно, или это ошибка в документации? Я не настолько осведомлен о теории компьютерного видения, поэтому, возможно, мне не хватает чего-то фундаментального здесь. Спасибо за ваше время!

+0

Вы когда-нибудь это выясняли? Какую версию (именно) OpenCV вы используете? –

+0

Честно говоря, нет. Я просто пошел с методом, который дал правильные результаты. Я использую 2.4.11 в C++. – HighVoltage

ответ

1

Я столкнулся с подобной проблемой. Я считаю, что OpenCV определяет вектор перевода противоположным образом, который можно было бы ожидать. С настройкой вашей камеры вектор перевода будет [-1, 0, 0]. Это счетчик интуитивно понятен, но оба RecoverPose и stereoCalibrate дают этот вектор трансляции.

Я обнаружил, что, когда я использовал неверный, но интуитивный вектор трансляции (например, [1, 0, 0]), я не смог получить правильные результаты, если бы не поменял местами точки1 и точки2 так же, как вы.

Я подозреваю, что переводный вектор фактически переводит точки в другую систему координат камеры, а не вектор, переводящий позы камеры.OpenCV Documentation, кажется, подразумевает, что это так:

Совместная матрица поворота перевод [R | T] называется матрица внешних параметров. Он используется для описания движения камеры вокруг статической сцены или наоборот, жесткого движения объекта перед неподвижной камерой. То есть [R | t] переводит координаты точки (X, Y, Z) в систему координат, фиксированную относительно камеры.

Википедии есть хорошее описание на Translation of Axis:

В новой системе координат, точка Р будет, по всей видимости, был переведен в противоположном направлении. Например, если xy-система переводится на расстояние h вправо и на расстояние k вверх, тогда P окажется переведенным на расстояние h влево и расстояние k вниз в x'y'-системе