Как рассчитать точки 3D-объекта из точек 2D-изображения с помощью стереотриангуляции?

У меня есть стереокалиброванная система камеры, откалиброванная с использованием OpenCV и Python. Я пытаюсь использовать его для расчета трехмерного положения точек изображения. Я собрал внутренние и внешние матрицы, а также матрицы E, F, R и T. Я не понимаю, как триангулировать точки 2D-изображения в точки 3D-объекта. Я прочитал следующее сообщение, но меня не понимает процесс (В откалиброванной установке стереовидения, как получить матрицы камеры, необходимые для реализации алгоритма трехмерной триангуляции?). Кто-нибудь может объяснить, как перейти из 2D в 3D? Читая вокруг, я чувствую, что фундаментальная матрица (F) важна, но я не нашел четкого способа связать ее с матрицей проекции (P). Кто-нибудь может помочь мне пройти через этот процесс?

Я ценю любую помощь, которую могу получить.


person eminentCodfish    schedule 11.03.2014    source источник


Ответы (1)


Если вы откалибровали свою стереокамеру, у вас должны быть внутренние K1, K2 для каждой камеры, а также вращение R12 и перевод t12 с первой камеры на вторую. Из них вы можете сформировать матрицы проекции камеры P1 и P2 следующим образом:

P1 = K1 * [I3 | 0]
P2 = K2 * [R12 | t12]

Здесь I3 - единичная матрица 3x3, а обозначение [R | t] означает укладку R и t по горизонтали.

Затем вы можете использовать функцию triangulatePoints (документацию), которая реализует разреженную стереотриангуляция от двух матриц камеры.

Если вам нужна плотная триангуляция или оценка карты глубины, для этого есть несколько функций. Сначала необходимо исправить два изображения, используя stereoRectify (документацию), а затем выполнить стереосопоставление , например, используя StereoBM (документация).

person BConic    schedule 11.03.2014
comment
К вашему сведению. Чтобы получить точные измерения, не забудьте взять выходную матрицу 4xn (из triangulatePoints) и разделить первые три столбца (x, y, z) на 4-й столбец. output /= output[3] - person eminentCodfish; 13.03.2014
comment
критично, чтобы каждая точка имела тип float, иначе вы получите неожиданные результаты (даже с ошибками). - person Kyle S.; 11.03.2019
comment
Приносим извинения за некромантаж этого вопроса и ответа, но предполагает ли эта процедура, что плоскости двух камер совпадают, или это в равной степени применимо в общем случае, когда камеры расположены произвольно и, возможно, даже не имеют одинаковых внутренних параметров? - person matanster; 24.03.2021
comment
@matanster применяется к произвольным камерам, но упомянутые функции предполагают, что внутренние и внешние параметры камер откалиброваны. - person BConic; 24.03.2021