Матрица проекции с 3d на 2d

У меня есть 3 точки в трехмерном пространстве, точное расположение которых я знаю. Предположим, это: (x0,y0,z0), (x1,y1,z1) и (x2,y2,z2).

Также у меня есть камера, которая смотрит на эти 3 точки, и я знаю двухмерное расположение этих трех точек на плоскости обзора камеры. Так, например, (x0,y0,z0) будет (x0',y0'), (x1,y1,z1) будет (x1',y1') и (x2,y2,z2) будет (x2',y2') с точки зрения камеры.

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


person Community    schedule 25.09.2008    source источник
comment
Это не моя домашняя работа!   -  person    schedule 25.09.2008


Ответы (4)


Это дает вам два набора, каждый из трех уравнений с 3 переменными:

a*x0+b*y0+c*z0 = x0'
a*x1+b*y1+c*z1 = x1'
a*x2+b*y2+c*z2 = x2'

d*x0+e*y0+f*z0 = y0'
d*x1+e*y1+f*z1 = y1'
d*x2+e*y2+f*z2 = y2'

Просто используйте любой метод решения одновременных уравнений, который является наиболее простым в вашей ситуации (их даже не сложно решить «вручную»). Тогда ваша матрица преобразования будет просто ((a, b, c) (d, e, f)).

...

На самом деле это слишком упрощенно и предполагает, что камера направлена ​​в начало вашей трехмерной системы координат, а не перспектива.

Для перспективы матрица трансформации работает примерно так:

               ( a, b, c, d )   ( xt )
( x, y, z, 1 ) ( e, f, g, h ) = ( yt )
               ( i, j, k, l )   ( zt )

( xv, yv ) = ( xc+s*xt/zt, yc+s*yt/zt ) if md < zt;

но матрица 4x3 более ограничена, чем 12 степеней свободы, так как мы должны иметь

a*a+b*b+c*c = e*e+f*f+g*g = i*i+j*j+k*k = 1
a*a+e*e+i*i = b*b+f*f+j*j = c*c+g*g+k*k = 1

Таким образом, у вас, вероятно, должно быть 4 точки, чтобы получить 8 уравнений, охватывающих 6 переменных для положения и угла камеры, и еще 1 для масштабирования двухмерных точек обзора, поскольку мы сможем исключить «центральные» координаты (xc, yc ).

Итак, если у вас есть 4 точки и вы преобразуете свои двумерные точки обзора относительно центра экрана, то вы можете получить 14 одновременных уравнений с 13 переменными и решить.

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

person tye    schedule 25.09.2008
comment
Ваше решение, вероятно, было лучшим ответом на мою проблему. Пожалуйста, расскажите немного подробнее о второй части решения. что такое xv и yv, а также md и zt и xt yt zt. Большое спасибо - person ; 25.09.2008

Ваша камера имеет (как минимум) 7 степеней свободы - 3 для положения, 3 для ориентации и 1 для FOV. Я уверен, что кто-то поправит меня, если я ошибаюсь, но не похоже, что 3 балла достаточно для полного решения.

Для обобщенного решения этой проблемы найдите «Просмотр корреляции» в Graphics Gems II.

person Community    schedule 25.09.2008
comment
7 обычно является правильным, хотя некоторые системы допускают два параметра для поля зрения: вертикальный и горизонтальный. Обычно они пропорциональны друг другу (т. Е. Экран 4: 3 = соотношение поля зрения 4: 3), но в некоторых случаях это может быть искажено, если пользователь желает. - person Neil N; 28.10.2009

То, что вы ищете, называется алгоритмом оценки позы. Взгляните на реализацию POSIT в OpenCV: http://opencv.willowgarage.com/documentation/c/calib3d_camera_calibration_and_3d_reconstruction.html#posit

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

Учебное пособие по этой реализации находится здесь: http://opencv.willowgarage.com/wiki/Posit.

Однако будьте осторожны: в учебнике используется квадратное окно просмотра, поэтому все координаты просмотра находятся в диапазоне от -1, -1 до 1,1. Это заставляет предположить, что они должны быть в системе координат камеры (до коррекции соотношения сторон). Это не так, поэтому, если вы используете область просмотра, например, соотношение сторон 4: 3, то ваши входные координаты должны быть в диапазоне от -1,3333, от -1 до 1,3333,1.

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

person Lex van der Sluijs    schedule 14.02.2011

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

person Jim Buck    schedule 25.09.2008
comment
Нет, он имеет в виду, что существует бесконечное количество матриц, которые делают то, что вы просите для данного набора точек. Вам нужно либо больше точек, либо меньше свободы (например, исправить угол обзора камеры), чтобы исправить это. - person ; 25.09.2008
comment
Если вы знаете плоскость обзора камеры (расстояние Z от камеры), используя точки, вы можете определить положение камеры, поскольку это просто пересечение трех линий. Оттуда, я думаю, можно было бы вычислить оси матрицы. - person Jim Buck; 25.09.2008