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

Я делаю калибровку камеры от Цай Алго. Я получил внутреннюю и внешнюю матрицу, но как я могу восстановить трехмерные координаты из этой информации?

enter image description here

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

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

enter image description here

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

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

Что я делаю не так?

Ответ 1

Если у вас есть внешние параметры, вы получите все. Это означает, что вы можете иметь Гомографию от внешних (также называемых 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

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

Ответ 2

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

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

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