Как я могу реверсировать 2D точки в 3D? - PullRequest
54 голосов
/ 16 сентября 2008

У меня есть 4 2D точки в пространстве экрана, и мне нужно спроецировать их обратно в 3D пространство. Я знаю, что каждая из 4 точек является углом жесткого прямоугольника, повернутого в 3D, и знаю размер прямоугольника. Как я могу получить 3D-координаты из этого?

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

Это может подпадать под зонтик фотограмметрии, но поиск в Google по этому поводу не привел меня к какой-либо полезной информации.

Ответы [ 14 ]

1 голос
/ 17 сентября 2008

Если вы знаете, что фигура представляет собой прямоугольник на плоскости, вы можете значительно ограничить проблему. Вы, конечно, не можете определить, «какая» плоскость, поэтому вы можете выбрать, чтобы она лежала на плоскости, где z = 0, а один из углов находится в точке x = y = 0, а ребра параллельны оси x / y.

Следовательно, точки в 3d являются {0,0,0}, {w, 0,0}, {w, h, 0} и {0, h, 0}. Я почти уверен, что абсолютный размер не будет найден, поэтому только отношение w / h является релевантным, так что это одно неизвестно.

Относительно этой плоскости камера должна находиться в некоторой точке cx, cy, cz в пространстве, должна указывать в направлении nx, ny, nz (вектор длины один, поэтому один из них является избыточным) и иметь focal_length / image_width factor of w. Эти числа превращаются в матрицу проекции 3x3.

Это дает в общей сложности 7 неизвестных: w / h, cx, cy, cz, nx, ny и w.

Всего известно 8 пар: 4 пары x + y.

Так что это можно решить.

Следующим шагом будет использование Matlab или Mathmatica.

1 голос
/ 17 сентября 2008

При проецировании из 3D в 2D вы теряете информацию.

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

Стереоскопическая реконструкция обычно начинается с двух 2D-изображений и проецируется обратно в 3D. Затем найдите пересечение двух трехмерных лучей.

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

В вашем случае, если у вас есть исходная матрица, у вас будет 4 луча в трехмерном пространстве. После этого вы сможете ограничить проблему своими размерами в 3D-прямоугольнике и попытаться ее решить.

Решение не будет уникальным, поскольку вращение вокруг любой оси, параллельной 2-й плоскости проекции, будет неоднозначным в направлении. Другими словами, если двумерное изображение перпендикулярно оси z, то вращение трехмерного прямоугольника по часовой стрелке или против часовой стрелки вокруг оси x приведет к тому же изображению. Аналогично для оси Y.

В случае, когда плоскость прямоугольника параллельна оси z, у вас есть еще больше решений.

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

В перспективной проекции все становится сложнее ...

1 голос
/ 17 сентября 2008

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

Подумайте об этом так: у вас есть четыре 3D-точки, которые составляют 3D-прямоугольник. Назовите их (x0, y0, z0), (x1, y1, z1), (x2, y2, z2) и (x3, y3, z3). Когда вы проецируете эти точки на плоскость x-y, вы отбрасываете координаты z: (x0, y0), (x1, y1), (x2, y2), (x3, y3).

Теперь, когда вы хотите спроецировать обратно в трехмерное пространство, вам нужно перепроектировать то, что было z0, .., z3. Но любой набор z-координат, которые а) сохраняют одинаковое расстояние между точками по оси x и б) сохраняют форму прямоугольника, будут работать. Итак, любой член этого (бесконечного) множества будет делать: {(z0 + i, z1 + i, z2 + i, z3 + i) | я <- R}. </p>

Edit @Jarrett: представьте, что вы решили это и получили прямоугольник в трехмерном пространстве. Теперь представьте, что вы двигаете этот прямоугольник вверх и вниз по оси Z. Те бесконечные количества переведенных прямоугольников имеют одинаковую проекцию x-y. Откуда ты знаешь, что нашел «правильный»?

Редактировать # 2: Хорошо, это из комментария, который я сделал по этому вопросу - более интуитивный подход к рассуждению об этом.

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

Теперь, как вы можете определить, как высоко над столом находится бумага, посмотрев на просто точки лазерного указателя?

Вы не можете. Переместите бумагу прямо вверх и вниз. Лазерные указки по-прежнему будут светиться в тех же местах на столе, независимо от высоты бумаги.

Найти координаты z в обратной проекции - это все равно, что пытаться определить высоту бумаги на основе точек лазерного указателя только на столе.

1 голос
/ 16 сентября 2008

Я вытащу свою книгу по линейной алгебре, когда вернусь домой, если никто не ответит. Но при @ D G не все матрицы обратимы. Сингулярные матрицы необратимы (когда определитель = 0). Это будет происходить постоянно, поскольку матрица проекции должна иметь собственные значения 0 и 1 и быть квадратной (поскольку она идемпотентна, поэтому p ^ 2 = p).

Простой пример: [[0 1] [0 1]], так как определитель = 0, и это проекция на линию x = y!

...