2D в 3D Проекция с заданным Z в мире - PullRequest
0 голосов
/ 20 ноября 2018

Извините, если раньше об этом спрашивали, но я не смог найти правильный ответ на свой вопрос.

Для лучшего понимания позвольте мне кратко объяснить контекст моей проблемы

Контекст

У меня есть два изображения (A и B) с неплоским объектом на нем.Я хотел бы иметь возможность взять координату пикселя pA из A и спроецировать ее на B. Поскольку моя сцена не плоская, я не могу использовать гомографию.Я хочу сначала спроецировать свой пиксель pA в трехмерный мир, а затем спроецировать результат на изображение B, чтобы получить pB.pA (2D) -> pWorld (3D) -> pB (2D).К счастью, я знаю координату z pworld.Мой вопрос касается первого шага pA (2D) -> pWorld (3D).

Вопрос

Как спроецировать мою 2D точку pA (u, v) вмир (pWorld = (X, Y, Z)), Z дается?У меня также есть внешняя матрица Rt (3x4) и внутренняя матрица K (3x3) моей камеры.

Что я пробовал

Я знаю, что: s*(u v 1)' = K * Rt * (X Y Z)' [1]

s - это шкала.Но я хотел бы иметь противоположный процесс, Z дается.Что-то вроде:

(X Y) = SOMETHING * (u v)

Я могу переписать [1], чтобы получить s*(u v 1/s 1/s)' = G * (X Y Z 1)'

с G = (l1 l2 l3 l4) (l означает строку)

l1 = первая строка (K * Rt)

l2 = вторая строка (K * Rt)

l3 = 0 0 1 / Z 0

l4 = 0 0 0 1

G является обратимым, и тогда я могу получить (X Y Z 1)' = inv(G) * (us vs 1 1)'

Но я не могу использовать это, так как не знаю масштаб.Я думаю, что я немного сбит с толку относительно этого масштаба.Я знаю, что обычно мы нормализовались, чтобы избавиться от этого, но здесь я не могу.

Может быть, это плохой способ продолжить.Если кто-то может объяснить мне хороший способ, я был бы очень рад услышать об этом.

Заранее спасибо.

1 Ответ

0 голосов
/ 21 ноября 2018

Я нашел решение, но оно чертовски уродливо.

Давайте рассмотрим матрицу 3x4 M:

M = K*Rt = (mij) 1<i<3, 1<j<4

Для упрощения давайте также рассмотрим коэффициенты A и B:

A = (m12-m32*u)/(m22-m32v)
B = (m31*u-m11)/(m31*v-m21)

Обозначения объяснены, давайте перейдем к системе.Как я уже сказал, система:

s*(u v 1)' = M*(X Y Z 1)'

У нас есть 3 уравнения и 3 неизвестных : с, X и Y .Мы можем заметить, что:

s = m31*X + m32*Y + m33*Z + m34

Обратите внимание, что если вы хотите проецировать в систему координат камеры, а не в мировую систему координат (аналогично случаю, когда нет вращения и перемещения),у вас есть s = Z, что намного проще для решения системы (пример здесь Чтобы вычислить мировые координаты из экранных координат с помощью OpenCV )

Имея это в виду, мы можем уменьшитьисходная система в систему из 2 уравнений с 2 неизвестными ( X и Y ):

Затем, послепосле некоторых вычислений мы наконец получаем:

X = [Z*((m23-M33*v)*A-m13+m33*u) + (m24-m34*v)*A-m14+m34*u ] / [A*(m31*v-m21)-m31*u+m11]

Y = [Z*((m13-m33*u)-B*(m23-m33*v)) + m14-m34*u-B*(m24-m34*v)] / [B*(m22-m32*v)-m12+m32*u]

Это выражение X и Y в зависимости от u, v и Z. Я проверил это с моим проектом, и он работал.

Не знаю, есть ли более чистый способ вычисления этого (с помощью Matrix и прочего), но это все, что я мог бы придумать на данный момент.

...