Получить 3D-координаты из пикселя 2D-изображения, если известны внешние и внутренние параметры

Делаю калибровку камеры от tsai algo. Я получил внутреннюю и внешнюю матрицу, но как я могу восстановить 3D-координаты из этой информации?

введите здесь описание изображения

1) Я могу использовать исключение Гаусса для поиска X, Y, Z, W, и тогда точки будут X/W , Y/W , Z/W как однородная система.

2) Я могу использовать документацию OpenCV:

введите здесь описание изображения

поскольку я знаю u, v, R, t, я могу вычислить X,Y,Z.

Однако оба метода приводят к разным результатам, которые неверны.

Что я делаю неправильно?


person YAHOOOOO    schedule 20.10.2011    source источник
comment
Очень хороший ответ, пожалуйста, если этот ответ поможет, отметьте его как правильный   -  person vgonisanz    schedule 24.08.2012


Ответы (2)


Если у вас есть внешние параметры, то у вас есть все. Это означает, что вы можете получить гомографию от внешних элементов (также называемых CameraPose). Поза — это матрица 3x4, гомография — это матрица 3x3, H определяется как

                   H = K*[r1, r2, t],       //eqn 8.1, Hartley and Zisserman

где K — внутренняя матрица камеры, r1 и r2 — первые два столбца матрицы поворота, R ; t — вектор перевода.

Затем нормализуйте, разделив все на t3.

Что происходит со столбцом r3, разве мы его не используем? Нет, потому что это избыточно, поскольку это перекрестный продукт двух первых столбцов позы.

Теперь, когда у вас есть омография, спроецируйте точки. Ваши 2d точки x, y. Добавьте им z=1, чтобы они стали 3D. Проецируйте их следующим образом:

        p          = [x y 1];
        projection = H * p;                   //project
        projnorm   = projection / p(z);      //normalize

Надеюсь это поможет.

person Jav_Rock    schedule 25.05.2012
comment
может быть, вы неправильно написали столбцы? Возможно, вы имели в виду столбцы (r12 r22 r32) и (r13 r23 и r33) вместо этого? - person EliteTUM; 04.07.2012
comment
Разве вы не предполагаете здесь, что поза относительно z == 0? Вы можете указать это. Третий столбец позы является избыточным только в том случае, если входящие координаты всегда имеют z == 0. - person Hammer; 22.08.2012
comment
Ну да, z=0 — это точка отсчета камеры, где должен быть автономный маркер, когда вы фотографируете его сверху. Таков принцип этой техники в дополненной реальности. Завтра я выложу ссылку на публикацию, где объясняются все методы и принципы дополненной реальности. - person Jav_Rock; 23.08.2012
comment
Интересно, как можно было бы получить гомографию из позы, когда плоскость не находится на Z = 0. Я нашел это соотношение H = R+t/d*n.T, где d — расстояние от камеры до плоскости, а n — нормаль к плоскости. Я пробовал, но у меня не работает, в моем случае плоскость не на Z=0 - person martinako; 16.11.2012
comment
Я не получил нормальную часть. p/p(z) даст z всех точек как 1. Итак, как получить 3D-точки? - person Froyo; 11.03.2013
comment
Это решение верно, если объект плоский. Для неплоского объекта вам нужно иметь как минимум две позы, чтобы восстановить 3D-точки в кадре объекта. - person ; 23.04.2013
comment
Это стандартный метод, который появляется в публикациях, он предназначен только для плоских текстур, и всегда z=0, потому что вы используете jpeg текстуры. Если вы используете другой отслеживаемый объект, вам необходимо знать его геометрию. Например модель автокада. - person Jav_Rock; 24.04.2013
comment
Гомография предназначена только для плоских сцен, а также для сцен, полученных чистым вращением. Фундаментальная матрица/основная матрица - это способ для общего случая, но вам нужно как минимум два вида сцены с точкой в ​​обоих из них, как упоминал пользователь 2311339. Затем вы триангулируете 3D-точку на основе пары совпадающих 2D-точек, по одной в каждом виде. - person rbaleksandar; 29.06.2014
comment
Пожалуйста, помогите мне, я не понимаю, что означает проекция / p (z)? где значение p(z)?какой элемент? - person Rashed DIP; 03.08.2018
comment
@Jav_Rock, почему, когда рыскание, тангаж, крен камеры в реальном мире равны 0,0,0, а пиксель, который я выбираю, является центром изображения, я получаю направление 0,0,1? вроде камера направлена ​​вниз? - person Stav Bodik; 22.01.2019

Как хорошо сказано в комментариях выше, проецирование координат 2D-изображения в 3D «пространство камеры» по своей сути требует создания координат z, поскольку эта информация полностью теряется в изображении. Одним из решений является присвоение фиктивного значения (z = 1) каждой точке пространства 2D-изображения перед проекцией, как ответил Jav_Rock.

p          = [x y 1];
projection = H * p;                   //project
projnorm   = projection / p(z);      //normalize

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

person DerekG    schedule 18.09.2019
comment
Привет @DerekG, не могли бы вы поделиться ссылкой на места, где я могу больше узнать о методе Pytorch/CNN? Включая исходный код... Спасибо :) - person Pe Dro; 10.08.2020
comment
github.com/DerekGloudemans/KITTI-utils Репозиторий больше не поддерживается, но он есть - person DerekG; 10.08.2020