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

StackOverflow https://stackoverflow.com/questions/7836134

Вопрос

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

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.

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

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

Это было полезно?

Решение

Если у вас есть внешние параметры, то у вас есть все. Это означает, что вы можете иметь гомографию из внешней (также называемой операционной). Поза - это матрица 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. Было бы рад предоставить код, но это было бы немного длинным для размещения здесь.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top