Внутренние параметры камеры для матрицы перспективы OpenGL: параметры ближней дальности?

Я занимаюсь разработкой приложения дополненной реальности, которое накладывает графику на изображение с камеры. Используя OpenCV Pose Estimator и встроенные параметры камеры из самого устройства, я могу создать довольно хорошую OpenCV Camera Matrix и OpenGL Perspective Matrix, которые дают приемлемые результаты.

Тем не менее, мое решение и все аналогичные решения, которые я изучал на этом форуме и в других местах в Интернете, просто используют несколько произвольных значений (обычно 1,0 и 100) для параметров ближней и дальней матрицы перспективы.

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

Фактически, когда эти два параметра (ближний, дальний) настроены, точка исчезновения перспективы меняется.

У кого-нибудь есть более разумный подход к получению параметров Ближнего и Дальнего из имеющихся данных?

2 ответа

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

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

  • asp: Соотношение сторон.
  • t2: Касательный половинного угла обзора.
  • n: Близкое расстояние.
  • f: Дальнее расстояние.

Матрица проекции тогда:

    [ 1 / (asp * t2)  0       0                  0                   ]
P = [ 0               1 / t2  0                  0                   ]
    [ 0               0       (n + f) / (n - f)  2 * n * f / (n - f) ]
    [ 0               0       -1                 0                   ]

Применение этого к вектору дает:

    [ x ]   [ x / (asp * t2)                      ]
P * [ y ] = [ y / t2                              ]
    [ z ]   [ (z * (n + f) + 2 * n * f) / (n - f) ]
    [ 1 ]   [ -z                                  ]

После деления перспективы вектор имеет вид:

[ x / (-z * asp * t2)                  ]
[ y / (-z * t2)                        ]
[ -(n + f + (2 * n * f) / z) / (n - f) ]
[ 1                                    ]

Как видите, x а также y Компоненты результирующего вектора, которые определяют положение вершины в окне (точнее, в пространстве НДЦ), не зависят от значений ближнего и дальнего расстояния. Ближайшие и дальние значения управляют только отображением координаты z в пространстве глаза на значение z (глубины) в пространстве NDC.

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

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

Большинство точек для выравнивания. Горизонтальное поле зрения можно рассчитать по наиболее широко расположенным точкам на центральной горизонтальной линии. Вертикальное поле зрения можно рассчитать аналогичным образом. Точки в центре и углах следует использовать, чтобы убедиться, что плоскость изображения с камеры центрирована и параллельна цели. (Если трудно совмещать точки со строками и столбцами изображения, вам может потребоваться более сложная модель камеры.)

После того как цель была установлена, горизонтальное поле зрения может быть рассчитано.

  • Пусть Z = дальность до цели в метрах.
  • Пусть D = расстояние между горизонтальными точками в метрах.
  • Пусть w = ширина изображения в пикселях.
  • Пусть x = расстояние между горизонтальными точками в пикселях.

Затем,

HFOV = 2 * arctan ((D * (w / x) / 2) / Z).

Аналогичный расчет применяется к вертикальному полю зрения.

Мы использовали этот простой метод для калибровки наших камер в проекте беспилотного наземного транспортного средства DARPA еще в 90-х годах, и он работал довольно хорошо.

Надеюсь, это поможет.

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