5

Предположим, у меня хорошие соответствия между двумя изображениями и попытка восстановить движение камеры между ними. я могу использовать OpenCV 3 в новые возможности для этого, например:Оценка положения камеры: как интерпретировать матрицы вращения и перевода?

Mat E = findEssentialMat(imgpts1, imgpts2, focal, principalPoint, RANSAC, 0.999, 1, mask); 

int inliers = recoverPose(E, imgpts1, imgpts2, R, t, focal, principalPoint, mask); 

Mat mtxR, mtxQ; 
Mat Qx, Qy, Qz; 
Vec3d angles = RQDecomp3x3(R, mtxR, mtxQ, Qx, Qy, Qz); 

cout << "Translation: " << t.t() << endl; 
cout << "Euler angles [x y z] in degrees: " << angles.t() << endl; 

Теперь у меня есть проблемы оборачивать вокруг моей головы, что R и t на самом деле означает. Являются ли они преобразованием, необходимым для сопоставления координат от места камеры 1 до места камеры два, как в p_2 = R * p_1 + t?

Рассмотрим пример с нуля истины вручную меченые соответствиями

enter image description here

выход я получаю это:

Translation: [-0.9661243151855488, -0.04921320381132761, 0.253341406362796] 
Euler angles [x y z] in degrees: [9.780449804801876, 46.49315494782735, 15.66510133665445] 

Я стараюсь соответствовать этому к тому, что я вижу в образе и придумайте интерпретацию, что [-0.96,-0.04,0.25] говорит мне, что я переместился вправо, поскольку координаты двинулись вдоль отрицательной оси х, но это также скажет мне, что я отошел дальше, так как координаты ved вдоль положительной z-оси.

Я также повернул камеру вокруг оси y (влево, что, я думаю, будет вращаться против часовой стрелки против отрицательной оси y, потому что в OpenCV ось y направлена ​​вниз, не делает ли она ?)

Вопрос: Является ли моя интерпретация правильной и если нет, то какая она правильная?

ответ

2

Получается, что моя интерпретация верна, отношение p2 = R * p1 + t действительно выполнено. Это можно проверить, используя cv::triangulatePoints() и cv::convertPointsFromHomogeneous, чтобы получить 3D-координаты из соответствующих точек (относительно камеры 1), а затем применить вышеупомянутое уравнение. Умножение с матрицей камеры камеры 2 затем дает координаты изображения p2.

1

Ваша интерпретация звучит о праве на меня. Я не 100% относительно ориентации оси в OpenCV, но я считаю, что вы правильно относитесь к оси Y.

Выход имеет смысл также не только с точки зрения кода, но если вы посмотрите на два изображения, вы можете представить себе, где будет отображаться полный поворот на 90 градусов (он будет по существу иметь тот же угол, но на противоположном сторона автомобиля)

Это довольно приличное объяснение концепции по механике твердого тела Motion тоже: http://nghiaho.com/?page_id=671

0

Давайте посмотрим. Рамка координат камеры OpenCV «X направлена ​​вправо, Y - к нижней части изображения, Z = X x Y в сторону сцены». Q = [R | t] - это преобразование координат от камеры2 к камере 1, так что t - вектор, укорененный в камере 1, с наконечником на камере 2, выраженный в кадре 1 камеры. Таким образом, ваш вектор перевода означает, что камера2 находится слева от камеры 1, что, учитывая ваши изображения, возможно только в том случае, если вид сбоку автомобиля находится в камере2, а вид спереди автомобиля находится в камере 1. Это согласуется с положительным компонентом Z перевода, так как в боковом обзоре автомобиль оказывается подальше от камеры.

Это идентификация также согласуется с рассчитанными вами углами Эйлера: они возвращаются в соглашении OpenGL, таким образом выражая поворот от источника к месту назначения. В вашем случае, поворот на 46 градусов вокруг вертикальной оси камеры1, против часовой стрелки w.r.t. ориентированная вниз ориентированная ось Y, приводит вас к сбоку.

+0

Но положительный z-компонент скажет мне, что камера2 движется к машине, но это не соответствует интерпретации, что камера2 является левым изображением. Что мне не хватает? – oarfish

+0

Перечитайте то, что я написал: «t - это вектор, внедренный в камеру1, с кончиком на камеру2». Положительная Z-составляющая t означает только, что центр камеры2 находится перед плоскостью XY камеры1, то есть перед центром камеры1. Это совершенно правдоподобно, учитывая ваши образы: представьте себе, чтобы расширить плоскость изображения в представлении, смотрящем на переднюю часть автомобиля, а затем решить, на какой стороне этого самолета должна быть камера с боковым видом. Кроме того, пожалуйста, поддержите/примите ответ, если найдете его полезным. –

+0

Если я это сделаю, мне кажется, что центр камеры 2 находится за * камерой 1, поэтому z должен быть отрицательным. Но это не очень понятно из-за поворота. – oarfish

1

На самом деле ваша интерпретация верна.

Прежде всего, вы правы, о ориентации оси y.Для иллюстрации системы координат камеры OpenCV см. here.

Ваш код вернет R и t со второй на первую камеру. Это означает, что если x1 является точкой в ​​первом изображении, а x2 является точкой второго изображения, то выполняется следующее уравнение: x1 = R*x2 + t. Теперь в вашем случае правильное изображение (вид спереди) находится от камеры 1 и левого изображения (вид сбоку) автомобиля от камеры 2.

Рассматривая это уравнение, мы видим, что в первую очередь применяется поворот , Таким образом, ваша камера в данный момент рисует левый кадр. Теперь ваш R задает вращение около 46 градусов вокруг оси y. Поскольку точки вращения по углу альфа совпадают с противоположной осью координаты на этот угол, ваш R говорит вам поворачивать влево. Как вы сами указываете, это кажется правильным, если смотреть на фотографии. Поскольку вращение вокруг других осей мало и трудно имитировать, опускайте их здесь. Итак, после применения вращения вы все еще стоите в том же положении, из которого был снят левый кадр, но ваша камера более или менее указывает на заднюю часть автомобиля или пространство прямо за автомобилем.

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

Надеюсь, это объяснение помогло вам представить движение, которое вы описываете как R, так и t.

Смежные вопросы