Получить 3D координаты из 2D -изображения Pixel, если внешние и внутренние параметры известны
-
27-10-2019 - |
Вопрос
Я делаю калибровку камеры от Tsai Algo. Я получил инвентарическую и внешнюю матрицу, но как я могу реконструировать 3D -координаты из этой перенормации?
1) Я могу использовать гауссовое устранение для поиска x, y, z, w, а затем точки будут x/w, y/w, z/w в качестве однородной системы.
2) Я могу использоватьДокументация OpenCV подход:
на сколько мне известно u
, v
, R
, t
, Я могу вычислить X,Y,Z
.
Однако оба метода оказываются в разных результатах, которые не являются правильными.
Что я делаю не так?
Решение
Если у вас есть внешние параметры, то у вас есть все. Это означает, что вы можете иметь гомографию из внешней (также называемой операционной). Поза - это матрица 3x4, гомография - матрица 3x3, ЧАС определяется как
H = K*[r1, r2, t], //eqn 8.1, Hartley and Zisserman
с K быть камерой внутренней матрицы, r1 а также r2 быть первыми двумя столбцами матрицы вращения, р; Т это вектор перевода.
Затем нормализовать разделение всего на T3.
Что происходит с столбцом R3, разве мы не используем это? Нет, потому что это избыточно, так как это перекрестный продукт 2 первых столбцов позы.
Теперь, когда у вас есть гомография, проецируйте очки. Ваши 2D -точки x, y. Добавьте их AZ = 1, так что они теперь 3D. Проецируйте их следующим образом:
p = [x y 1];
projection = H * p; //project
projnorm = projection / p(z); //normalize
Надеюсь это поможет.
Другие советы
Как хорошо указано в комментариях выше, проецируя 2D -координаты изображения в 3D «пространство камеры» по своей сути требует составления координат Z, так как эта информация полностью потеряна на изображении. Одним из решений является присвоение фиктивного значения (z = 1) каждой из точек пространства 2D изображения перед проекцией, как ответил JAV_ROCK.
p = [x y 1];
projection = H * p; //project
projnorm = projection / p(z); //normalize
Одной из интересной альтернативы этому фиктивному решению является обучение модели, чтобы предсказать глубину каждой точки перед резакацией в трехмерное пространство камеры. Я попробовал этот метод и имел высокую степень успеха, используя Pytorch CNN, обученный на 3D -ограничивающих коробках из набора данных Kitti. Было бы рад предоставить код, но это было бы немного длинным для размещения здесь.