Вопрос

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

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

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

Это было полезно?

Решение

Это дает вам два набора, каждый из трех уравнений с 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)).

...

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

С точки зрения перспективы, матрица преобразования работает скорее как:

               ( 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 точки и преобразовать точки вашего 2D просмотра так, чтобы они были расположены относительно центра вашего дисплея, то вы можете получить 14 одновременных уравнений с 13 переменными и решить их.

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

Другие советы

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

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

То, что вы ищете, называется алгоритмом оценки позы.Взгляните на реализацию 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.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top