Корреляция между калибровочной матрицей камеры OpenCV и проекционной матрицей OpenGL - PullRequest
0 голосов
/ 09 мая 2018

У меня довольно трудное время для рендеринга модели .stl с такими же размерами и пропорциями, которые визуализируются на изображении реального объекта. Я поместил реальный объект в центр области обзора и хотел бы переключиться между моделью и реальным объектом (реальный объект в 9 раз меньше, чем один в модели).

Сначала я калибрую камеру, используя OpenGL, как в учебнике , когда фокусировка оптимальна для реального объекта. После получения значений cx, cy, fx и fy я создаю матрицу перспективы с этими значениями и использую функцию glMultMatrixd. Наконец, я изменяю размер фотографии, чтобы она соответствовала окну OpenGL, и сравниваю фотографию с визуализированной моделью.

Но у меня есть некоторые проблемы с результатом:

  1. есть пропорциональное искажение (шире, чем высокий)
  2. есть искажение перспективы (камера перпендикулярна по отношению к объекту, поэтому я должен видеть только верхнюю часть объекта, но она показывает боковую сторону объекта)
  3. размер не совместим с реальным объектом (чуть меньше)

Моя матрица отношений ниже:

GLdouble perspMatrix[16] = { fx / cx,     0   ,   0    ,    0,
    0,   fy / cy ,   0    ,    0,
    0,     0   ,  -(znear + zfar) / (znear - zfar), 2 * zfar*znear / (zfar - znear),
    0,     0   ,  -1    ,   0 };

1 Ответ

0 голосов
/ 25 мая 2018

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

Вы также создаете симметричную область просмотра (справа == слева == cx и top == bottom == cy), в которой предполагается, что оптическая ось (cx, cy) находится в центре тепловизора камеры. Настоящие камеры никогда не бывают настолько идеальными, поэтому мы должны их калибровать. Вам нужен асимметричный усеченный элемент, используя left == cx, right == (width-cx) и т. Д .; это руководство должно помочь.

Обратите внимание, что в OpenGL + Y вверху, а + Z позади камеры (в OpenCV + Y внизу, + Z впереди камеры), поэтому проверьте знаки на матрице.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...