Я работаю над 3D реконструкцией. А теперь, когда я рассматриваю пару образов. У меня есть набор соответствующих точек. и у меня есть детали моей камеры. Например, у меня есть детали фокуса, матрица вращения и перевода (4 * 4). и я хочу проецировать свои точки в 3D (триангуляция). Итак, насколько я знаю, это довольно прямолинейно с помощью факторной алгебры. Но мне все еще нужно ясно понять это. У кого-нибудь есть идеи о том, как следовать этому? Я работаю в Matlab, поэтому мне нужно это реализовать! Я могу быть снова слишком широким или что-то в этом роде. Но, пожалуйста, направь меня!
3D-реконструкция по калиброванным изображениям камеры
Ответы (1)
Вам нужно будет вычислить матрицу камеры на основе известных атрибутов камеры; это масштабирующая проекционная матрица, которая сопоставляет трехмерную однородную точку с вашими двумерными пиксельными координатами. (Обратите внимание, что если вам нужна достойная точность, вам также необходимо измерять и систематически исправлять искажения объектива вашей камеры, но это деталь второго порядка.)
Затем умножьте матрицу вашей камеры на матрицу позы (упомянутую вами матрицу вращения/перемещения 4x4), чтобы получить матрицу (скажем, T
в целом), которая проецирует точку в выбранной вами трехмерной системе координат в (исправленные) пиксельные координаты вашей камеры. :
pixel vector Q.x = T * point P.x
Q.y P.y
Q.z P.z
Q.w 1
pixel coordinates = (Q.x/Q.w, Q.y/Q.w)
"pixel depth" = Q.z/Q.w
Вы можете инвертировать эту матрицу и использовать ее для проецирования координат пикселей в 3D-лучи, выбрав две глубины: одну в месте расположения камеры, а другую вне ее (лучше выбрать либо единичную глубину, либо точку в бесконечности). Вы не можете ожидать, что ваши лучи точно пересекутся, но вы можете получить наилучшее местоположение в зависимости от того, где два соответствующих луча находятся ближе всего; в более общем случае вы можете рассматривать пересечение произвольного числа лучей как задачу наименьших квадратов (в идеале, с учетом ошибки, ожидаемой от каждого луча).