Получите 3D-координаты из пикселя 2D-изображения, если известны внешние и внутренние параметры
Я делаю калибровку камеры от Цай Алго. Я получил внутреннюю и внешнюю матрицу, но как я могу восстановить трехмерные координаты из этой информации?
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. Был бы рад предоставить код, но он был бы немного длинным для размещения здесь.