Как найти 3D-координаты спроецированного прямоугольника?

У меня есть следующая проблема, которая в основном алгоритмическая.

  • Пусть ABCD — прямоугольник с известными размерами d1, d2, лежащий где-то в пространстве.
  • Прямоугольник ABCD проектируется на плоскость P (в общем случае образуя трапецию KLMN). Я знаю проекционную матрицу H.
  • Я также могу найти 2D-координаты краевых точек трапеции K, L, M, N.

Вопрос следующий:

  • Учитывая матрицу проекции H, координаты ребер трапеции и зная, что наш объект представляет собой прямоугольник с заданной геометрией (размеры d1, d2), можем ли мы вычислить трехмерные координаты точек A, B, C, D?

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

Одной Матрицы проекции недостаточно, поскольку луч проецируется в одну и ту же точку. Тот факт, что объект имеет известные размеры, заставляет меня поверить, что проблема разрешима и есть конечные решения.

Если я выясню, как можно сделать эту реконструкцию, я знаю, как ее запрограммировать. Поэтому я прошу алгоритмический/математический ответ.

Любые идеи приветствуются Спасибо


person Community    schedule 10.03.2009    source источник


Ответы (5)


Вам нужно вычислить обратную матрицу проекции. (ваша матрица не может быть единственной)

person koni    schedule 10.03.2009
comment
Обратной матрицы проекции недостаточно, поскольку одна точка на плоскости изображения не проецируется на луч. Таким образом, проецируя четыре точки K, L, M, N в обратном направлении, мы получаем только четыре линии, а не точное положение прямоугольника в пространстве. - person ; 10.03.2009
comment
@netclectic - Указывала ли исходная карта проекции на лучи? Нет - и не будет обратного. Когда вы строите матрицу проекции, вы решаете, на какую глубину проецировать. - person mbeckish; 10.03.2009

Я собираюсь дать довольно краткий ответ здесь, но я думаю, что вы поняли мой основной посыл. Я предполагаю, что у вас есть проекционная матрица 3x4 (P), поэтому вы сможете получить центр камеры, найдя правильный нулевой вектор P: назовите его C.

Когда у вас есть C, вы сможете вычислять лучи с тем же направлением, что и векторы CK, CL, CM и CN (т.е. перекрестное произведение C и K, L, M или N, например, CxK)

Теперь все, что вам нужно сделать, это вычислить 3 точки (u1,u2,u3), которые удовлетворяют следующим 6 ограничениям (произвольно предполагая, что KL и KN являются смежными и ||KL|| >= ||KN||, если d1 >= d2) :

  1. u1 лежит на CK, т. е. u1.CK = 0
  2. u2 лежит на CL
  3. u3 лежит на CN
  4. ||u1-u2|| = d1
  5. ||u1-u3|| = d2
  6. (u1xu2).(u1xu3) = 0 (ортогональность)

где A.B = скалярное произведение векторов A и B ||A|| = евклидова норма AxB = перекрестное произведение A и B

person Jacob    schedule 20.03.2009

Я думаю, что эта проблема породит множество возможных решений, по крайней мере, в 2D. Для 2D случая:

           |   
-----------+-----------
          /|\
         / | \
        /  |  \
       /---+---\VP
      /    |    \
     /     |     \
    /      |      \
   /       |       \
  /        |   --   \
 /         |    |    \
/          |    |     \

На приведенной выше диаграмме вертикальный сегмент и горизонтальный сегмент будут проецироваться на одну и ту же линию на плоскости обзора (VP). Если вы нарисуете это в масштабе, вы увидите, что два луча от глаза проходят через каждую конечную точку непроецируемой линии. Эта линия может быть во многих положениях и поворотах — представьте, что вы бросаете палку в конус, она может застрять в любом количестве положений.

Таким образом, в 2D-пространстве существует бесконечное количество решений в пределах четко определенного множества.

Это относится к 3D?

Алгоритм будет примерно таким:

  1. Инвертировать матрицу проекции
  2. Вычислите четыре луча, которые проходят через вершины прямоугольника, эффективно создавая перекошенную пирамиду.
  3. Попробуйте вписать свой прямоугольник в пирамиду. Это сложная часть, и я пытаюсь мысленно визуализировать прямоугольники в пирамидах, чтобы увидеть, могут ли они вписаться более чем одним способом.

РЕДАКТИРОВАТЬ: Если бы вы знали расстояние до объекта, это стало бы тривиальным.

РЕДАКТИРОВАТЬ V2:

Хорошо, пусть Rn — четыре луча в мировом пространстве, т.е. преобразованные через обратную матрицу, выраженную через m.Rn, где |Rn| это один. Таким образом, четыре точки прямоугольника таковы:

P1 = aR1
P2 = bR2
P3 = cR3
P4 = dR4

где P1..P4 — точки по окружности прямоугольника. Отсюда, используя немного векторной математики, мы можем вывести четыре уравнения:

|aR1 - bR2| = d1
|cR3 - dR4| = d1
|aR1 - cR3| = d2
|bR2 - dR4| = d2

где d1 и d2 — длины сторон прямоугольника, а a, b, c и d — неизвестные.

Теперь может не быть решения вышеизложенного, и в этом случае вам нужно будет поменять местами d1 на d2. Вы можете расширить каждую строку до:

(a.R1x - b.R2x)2 + (a.R1y - b.R2y)2 + (a.R1z - b.R2z)2< /sup> = d12

где R1? а Р2? являются компонентами x/y/z лучей 1 и 2. Обратите внимание, что вы решаете для a и b в приведенном выше примере, а не для x, y, z.

person Skizz    schedule 10.03.2009

m_oLogin прав. Если я правильно понимаю вашу цель, изображение, которое снимает камера, это плоскость P, верно? Если это так, вы измеряете K, L, M, N по 2D-изображению. Вам нужна обратная матрица проекции, чтобы восстановить A, B, C и D.

Теперь я никогда не делал этого раньше, но мне кажется, что вы можете столкнуться с той же проблемой, что и GPS, только с 3 исправлениями спутников - есть два возможных решения, одно «позади» P и одно «перед» ним, правильно?

person n8wrl    schedule 10.03.2009

Матрица проекции включает в себя как перспективу, так и масштаб, поэтому инверсия даст вам решение, которое вам нужно. Я думаю, вы предполагаете, что он только инкапсулирует перспективу, и вам нужно что-то еще, чтобы выбрать правильный масштаб.

person mbeckish    schedule 10.03.2009
comment
В процессе проецирования из мирового пространства в пространство просмотра теряется информация, а именно глубина (бесконечный набор трехмерных точек сопоставляется с одной и той же двумерной точкой). ОП хочет знать, как пересчитать потерянные данные. - person Skizz; 10.03.2009
comment
Набор проецируемых точек не содержит информацию о глубине, но матрица проекции содержит ее, поэтому вы можете использовать инверсию, чтобы вернуться к исходному прямоугольнику, если вы знаете исходную матрицу проекции. - person mbeckish; 10.03.2009
comment
Матрица проекции не инкапсулирует масштаб. - person Jacob; 20.03.2009
comment
@Jacob - вы проецируете прямоугольник на многоугольник на определенной целевой плоскости, а не на тень, которая отбрасывается от прямоугольника в заданном направлении. Или иначе, как вы получили конкретные точки K, L, M, N спроецированной формы? - person mbeckish; 20.03.2009