Внутренние параметры камеры для матрицы перспективы 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-х годах, и он работал довольно хорошо.
Надеюсь, это поможет.