Обратная 3D (треугольная) проекция

У меня есть трехмерная математическая задача, которую я просто не могу решить.

У меня есть данные 3 балла. Данные представляют собой (2D) координаты на плоскости, плавающие где-то в трехмерном пространстве. Я также знаю (2D) координату проекции. Это приводит к следующему массиву данных:

[[[x1,y1], [px1,py1],
 [[x2,y2], [px2,py2],
 [[x3,y3], [px3,py3]]

Где нормальные (x1 и т. Д.) Координаты обозначают координаты на плоскости, а другие (px1 и т. Д.) - проецируемые координаты.

То, что я хотел бы сделать, это спроектировать новую 2D-координату ([x4,y4]).

,

Что я пробовал до сих пор:

Конечно, вам нужен глаз для проецирования, поэтому я установил его на [xe,ye,-1]. Хе и вы известны. (Это ссылка на фотографию, поэтому я просто поместил глаз в центр фотографии.)

Под глазом я разместил проекционную поверхность (z=0). Это дает следующие координаты проекции:

[[[x1,y1], [px1,py1,0],
 [[x2,y2], [px2,py2,0],
 [[x3,y3], [px3,py3,0]]

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

Я также подумал, что мог бы сделать параметризованную формулу линий, проходящих от глаза через координаты проекции. Для line1 это будет:

line1x = xe+(px1-xe)*t1
line1y = ye+(py1-ye)*t1
line1z = -1+t1 // = -1+(0--1)*t1

Я также знаю расстояние между точками в 3D. Это так же, как в 2D. Это означает, что расстояние между точкой 1 и точкой 2 будет равно sqrt((x1-x2)^2+(y1-y2)^2).

Я также знаю расстояние между линиями (line1 и line2) в любое время. Это sqrt((line1x-line2x)^2+(line1y-line2y)^2+(line1z-line2z)^2).

Тем не менее, я не знаю, как идти отсюда... Или даже если это правильный путь.

,

Я надеюсь, вы понимаете, что я хочу делать, и что вы можете мне помочь.

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

5 ответов

Есть функция Projection, которая может преобразовывать точки так, что Projection([x1, y1]) = [px1, py1], Projection([x2, y2]) = [px2, py2], Projection([x3, y3]) = [px3, py3]. Если я правильно понимаю, автор хочет знать, как найти эту функцию проекции, чтобы он мог преобразовать [x4, y4] в [px4, py4].

Поскольку здесь мы имеем дело с плоскостями, функция проекции выглядит следующим образом:

Proj([ix, iy]) :
    return [ax*ix + bx*iy + cx,
            ay*iy + by*iy + cy];

Используя это мы можем сделать 2 системы уравнений для решения.

Первый
x1 * ax + y1 * bx + cx = px1
x2 * ax + y2 * bx + cx = px2
x3 * ax + y3 * bx + cx = px3

Решение для топора, BX и CX дает нам

ax = (px1 * (y3 - y2) - px2*y3 + px3*y2 + (px2 - px3) * y1) /
     (x1 * (y3 - y2) - x2*y3 + x3*y2 + (x2 - x3) * y1)
bx = - (px1 * (x3 - x2) - px2*x3 + px3*x2 + (px2 - px3) * x1) /
     (x1 * (y3 - y2) - x2*y3 + x3*y2 + (x2 - x3) * y1)
cx = (px1 * (x3*y2 - x2*y3) + x1 * (px2*y3 - px3*y2) + (px3*x2 - px2*x3) * y1) /
     (x1 * (y3 - y2) - x2*y3 + x3*y2 + (x2 - x3) * y1)

Второй x1 * ay + y1 * by + cy = py1
x2 * ay + y2 * by + cy = py2
x3 * ay + y3 * by + cy = py3

Решение для ай, мимо и ай дает нам

ay = (py1 * (y3 - y2) - py2*y3 + py3*y2 + (py2 - py3) * y1) /
     (x1 * (y3 - y2) - x2*y3 + x3*y2 + (x2 - x3) * y1)
by = - (py1 * (x3 - x2) - py2*x3 + py3*x2 + (py2 - py3) * x1) /
     (x1 * (y3 - y2) - x2*y3 + x3*y2 + (x2 - x3) * y1)
cy = (py1 * (x3*y2 - x2*y3) + x1 * (py2*y3 - py3*y2) + (py3*x2 - py2*x3) * y1) /
     (x1 * (y3 - y2) - x2*y3 + x3*y2 + (x2 - x3) * y1)

Примечание: я использовал этот инструмент для решения систем уравнений.

Написать

(x4,y4,1) = A1*(x1,y1,1) + A2*(x2,y2,1) + A3*(x3,y3,1),

решение для A1,A2,A3. затем

(xp4,yp4) = A1*(px1,py1) + A2*(px2,py2) + A3*(px3,py3).

1-е редактирование.

(A1,A2,A3) является решением линейной системы Mat*(A1,A2,A3)=(x4,y4,1).

      ( x1  x2  x3 )
Mat = ( y1  y2  y3 )
      (  1   1   1 )

Это может быть решено различными способами. Например, используя правила Крамера.

2-е редактирование.

Вставленные мною 1 - это не координаты Z, а однородные расширения входных координат (которые должны быть евклидовыми координатами). (A1,A2,A3) - однородные координаты в базисе, образованном вершинами треугольника.

3-е редактирование.

Соответствие между трехмерной плоскостью и плоскостью проекции является проективным преобразованием. Она может быть определена как матрица 3x3 T, работающая с однородными координатами во входной плоскости (x,y,1) (в вашей системе координат) и создающая координаты (u,v,t) в плоскости проекции. Тогда px=u/t и py=v/t.

Если точка имеет однородные координаты (A1,A2,A3) в базисе, образованном тремя точками входной плоскости (не на одной линии), то ее проекция имеет такие же однородные координаты в проецируемом базисе.

Мне это показалось совершенно ясным 1 час назад, но теперь я начинаю сомневаться: может быть, нужно знать еще одну пару точек, чтобы найти единственное решение проблемы... Если вы можете найти это, взгляните на книга "Алгебраическая проективная геометрия" Дж. Г. Семпла и Г. Т. Книбоне.

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

Я не очень понимаю проблему? Вы пытаетесь найти объект в 3d-пространстве, который, как вы знаете, находится на плоскости (например, на стене или полу), и единственный вход, который у вас есть, - это 3 точки (из которых вы знаете расстояния между ними в 3d-пространстве) от фотоаппарат?

В этом случае у вас будет 3 уравнения, подобных этому, где localCoordinates - это координаты точек в пространстве объектов (дает известное расстояние между точками), а world - это положение объектов в 3d-пространстве.

cameraCoordinates = world*view*projection*localCoordinates

Это даст систему уравнений с 6 неизвестными (вращение и положение в 3d) и 6 уравнениями (2 для каждой точки). Однако он будет нелинейным, поэтому вы должны решить его, используя численные методы. Попробуйте метод Ньютона Рапсона.

Здесь "немного" поздно, но ответ с наивысшей оценкой не учитывает трехмерное пространство проблемы. У нас есть проблема перспективного проецирования, когда три точки на плоскости (фактически любые три трехмерных точки) проецируются (как в проекционной геометрии) на поверхность камеры.

Невозможно дать однозначное решение этой проблемы (существует несколько решений). Общая проблема определения положения и положения камеры с учетом 3-х трехмерных точек и их соответствующих 2D-перспективных проекций может быть решена с использованием алгоритма P3P (Perspective-3-Point) из оригинальной статьи RANSAC, которая дает до четырех возможных возможных решений (с точки перед камерой).

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

Другие вопросы по тегам