0

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

Однако мое решение и все аналогичные, которые я рассматривал на этом форуме и в других интернет-точках, просто используют несколько произвольных значений (обычно 1.0 и 100) для параметров перспективы и дальности.

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

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

У кого-нибудь есть более здравый подход для получения параметров Near and Far из доступных данных?

+0

Вы применяете какое-то искажение поддельной линзы во время рендеринга? – Micka

ответ

3

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

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

  • 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 компонент результирующего вектора, который определяет положение вершины в окне (точнее, в пространстве NDC), не зависит от значений ближнего и дальнего расстояния. Ближайшие и дальние значения управляют отображением координаты z в пространстве глаз в значение z (глубина) в пространстве NDC.

+1

расстояние между ближним и дальним, однако, влияет на точность буферизации глубины! Поэтому, если параметр «near» уменьшается, пиксель вершин вблизи плоскости «far» может быть ошибочным. – Micka

+0

Привет Ретро: Спасибо за прекрасный комментарий. Да, я ошибаюсь, и вы правы: параметры дальнего действия НЕ играют роли в перспективе изображения (или месте исчезновения точек). Я разместил изображение своей ситуации здесь: http://i.stack.imgur.com/VnLB6.png. Независимо от того, какие поправки я применяю к переводу и вращению X, Y и Z, мой куб OpenGL никогда не накладывает должного реального кубика Rubik. Я по-прежнему считаю, что это перспектива, но теперь я думаю, что, возможно, корень дела находится в поле зрения углов встроенных данных калибровки камеры. Спасибо за помощь. –

0

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

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

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

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

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

Затем

ВЧКИВЛ = 2 * агс ((Д * (ш/х)/2)/Z).

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

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

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