Калибровка камеры / модель камеры с точечным отверстием и разработка 3d-позиции

10

У меня есть откалиброванная камера, и у меня есть внутренние параметры. У меня также есть внешние параметры относительно точки (мирового происхождения) на плоской поверхности в реальном мире. Эту точку я задал в качестве начала координат в реальном мире [0,0,0] с нормалью [0,0,1].

Из этих внешних параметров я могу определить положение и поворот камеры в трехмерных координатах мировой плоскости, используя это здесь: http://en.wikipedia.org/wiki/Camera_resectioning

Теперь у меня есть вторая точка, из которой я извлек координаты изображения для [x, y]. Как мне теперь получить 3d-положение этой точки в мировой системе координат?

Я думаю, что интуиция заключается в том, что я должен проследить луч, который идет от оптического центра камеры (для которого у меня теперь есть 3D-положение, как описано выше), через плоскость изображения [x, y] камеры, а затем через план моего реального мира, который я определил наверху.

Теперь я могу пересечь трехмерный координатный луч с плоскостью, которую я знаю, и указать точку на этой плоскости. Чего я не понимаю, так это как определить положение и направление 3d, когда оно покидает плоскость изображения через пиксель. Меня смущает трансформация через разные системы координат.

гепард
источник
Проверьте этот ответ, это может помочь. Если вы думаете, что что-то может / может быть завершено, просто скажите мне. dsp.stackexchange.com/a/2737/1473
Jav_Rock

Ответы:

6

Если у вас есть внешность, то это очень легко. Иметь внешность - это то же самое, что иметь «позу камеры» и то же самое, что иметь гомографию. Проверьте этот пост в stackoverflow.

У вас есть внешность, также называемая позой камеры, которая описывается как перевод и вращение:

Pose=[R|t]=[R11R12R13txR21R22R23tyR31R32R33tz]

Вы можете получить гомографию из позы следующим образом:

ЧАСзнак равно1TZ[р1Икср2ИксTИкср1Yр2YTYр1Zр2ZTZ]

Затем вы можете проецировать свои 2D точки в соответствующие 3D точки, умножив гомографию на точки:

п2Dзнак равно[ИксY1] Добавить Zзнак равно1 сделать их однородными

п3Dзнак равноЧАС*п2D

пзнак равноп/п(Z) Нормализовать баллы

Jav_Rock
источник
что вы подразумеваете под p (z) здесь?
Белал Хомайдан
3

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

При обратной проекции вы берете псевдообратную матрицу камеры и умножаете результат на ваше однородное представление точки изображения:п

пзнак равноК[р-рС]ИксрепроJесTеdзнак равноп+Икс

СИксВзнак равноω[ИксYZ1]Tωзнак равно1

Uзнак равноИксрепроJесTеd-Сvзнак равноU| |U| |L(T)знак равноС+Tv

Πзнак равно[π1π2π3π4]T,π1Икс+π2Y+π3Z+π4знак равно0L(T)знак равноΠT

3×3ЧАС

ИкспLaNезнак равно[ИксY01]TИксзнак равнопИкспLaNезнак равноЧАС[ИксY1]T

Икс

ИкспLaNезнак равноЧАС-1Икс

ЧАС

ЧАСзнак равнор+1dTNT

dTзнак равно-рС

buq2
источник
2

Вы не можете знать 3d позицию второй точки. Это может быть любая из точек на луче от вашего центра камеры до бесконечности.

Вы можете сделать следующее:

  • Создайте предопределенное трехмерное пространство, которое напоминает реальную сцену
  • Получите больше точек изображений под другим углом, используя пересечение лучей под разными углами, вы можете получить аппроксимацию 3d-точки.
Geerten
источник
Подожди. Я могу найти точку трехмерного мира, что 3d-луч пересекает плоскую поверхность, конечно? Поскольку я знаю трехмерную мировую координату и трехмерную нормаль к этой плоскости ..... 3d-точка, которую я пытаюсь найти, это точка, в которой она пересекает эту плоскую поверхность !! (Извините, я чувствую, что мои объяснения были недостаточно хороши)
Гепард
Что вы имеете в виду с плоской поверхностью? Плоскость изображения или плоскость нулевых мировых координат? В последнем случае вы можете вычислить пересечение, но это означает, что ваша 3d сцена не 3d, а 2d :) (потому что это плоскость).
Гертен
Да, извини, это просто не пришло мне в голову. Я понимаю, что вы говорите, это просто не имеет смысла для меня визуально. Итак, да, моя сцена на самом деле "2d", потому что у меня есть плоскость изображения, и у меня есть плоскость реального мира, на которой лежит источник реального мира [0,0,0] и имеет реальный нормальный мир, равный [0,0, 1], поэтому каждая точка, лежащая на этой плоскости реального мира, имеет вид [x, y, 0]. Я знаю, что могу вычислить пересечение через ax + by + cz + d = 0, но это то, с чем у меня проблемы. (Продолжение следует в следующем комментарии)
Гепард
У меня есть луч, который начинается в моем центре камеры / источнике, для которого у меня есть реальный мир [x, y, z] и реальный мир, нормальный [nx, ny, nz]. Мне нужно запустить луч из этой точки, который пересекает плоскость изображения в [u, v], а затем пересекает плоскость реального мира в [x, y, 0] (именно этот x, y я хочу получить). То, с чем у меня возникают проблемы, - это первое, пересечение с плоскостью изображения. Я не вижу, как я это делаю?
Гепард
Возможно, вы захотите взглянуть на: en.wikipedia.org/wiki/Line-plane_intersection
Geerten