2012-06-11 6 views
6

Я хочу увеличить виртуальный объект в точке x, y, z метров. OpenCV имеет функции калибровки камеры, но я не понимаю, как именно я могу дать координаты в метрах.Как найти матрицу камеры для расширенной реальности?

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

Я установил матрицу проекции следующим образом и создаю единичный куб при z = 2,415 + 0,5. Где 2.415 - расстояние между глазом и плоскостью проекции (модель камеры Пинхол) Поскольку лицо куба находится в передней плоскости отсечения, а его размер - это единица, она не должна охватывать весь видовой экран?

Matrix4x4 m = new Matrix4x4(); 
    m[0, 0] = 1; 
    m[0, 1] = 0; 
    m[0, 2] = 0; 
    m[0, 3] = 0; 

    m[1, 0] = 0; 
    m[1, 1] = 1; 
    m[1, 2] = 0; 
    m[1, 3] = 0; 

m[2, 0] = 0; 
    m[2, 1] = 0; 
    m[2, 2] = -0.01f; 
    m[2, 3] = 0; 

    m[3, 0] = 0; 
    m[3, 1] = 0; 
    m[3, 2] = -2.415f; 
    m[3, 3] = 0; 
+0

Если вы установили m [3,2] = -1/2.415f и m [3,3] = 1 проекционная матрица работает правильно –

ответ

4

Я закончил измерение поля зрения вручную. Когда вы знаете FOV, вы можете легко создать матрицу проекций. Не нужно беспокоиться о единицах, потому что в конце проекция имеет вид (X * d/Z, Y * d/Z). Какими бы ни были единицы X, Y, Z, отношение X/Z остается неизменным.

5

Глобальный масштаб вашей калибровки (т.е. единицы измерения координат 3D-пространстве) определяется геометрией объекта калибровки используемого. Например, когда вы откалибруете в OpenCV, используя изображения плоской шахматной доски, входы в процедуру калибровки представляют собой соответствующие пары (P, p) трехмерных точек P и их изображения p, (X, Y, Z) координаты 3D точки выражаются в мм, см, дюймах, милях, независимо от того, что требуется по размеру используемой цели (и оптике, которая ее отображает), и 2D-координаты изображений находятся в пикселях. Результатом калибровочной процедуры является набор параметров (составляющих матрицы проекции P и параметров нелинейного искажения k), которые «преобразуют» 3D-координаты, выраженные в этих метрических единицах, в пиксели.

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

Например, если вы хотите добавить еще более пушистую пару трехмерных губ на видео Анджелины Джоли и соединить их с оригинальным видео, чтобы новые поддельные губы оставались прикрепленными и выглядели «естественными» на ее лице , вам просто нужно перемасштабировать 3D-модель поддельных губ, чтобы она правильно совпадала с изображением губ. Независимо от того, находится ли модель на расстоянии 1 ярда или одна миля от камеры CG, в которой вы выполняете композицию, совершенно не имеет значения.

+1

Мне нравится пример :) – Ani

+1

Я могу увеличить модели без правильного масштаба, но я хотите, чтобы это было точно в метрах. Я буду делать стерео-рендеринг, и он должен дать точное восприятие глубины. –

+0

Метрическая точность также не имеет отношения к случаю стереоизображения: все, что вам нужно в этом случае, заключается в рендеринге с правильным количеством левого правого несоответствия в двух камерах. До тех пор, пока все отношения размера и расстояния верны, реальный глобальный масштаб не может быть воспринят. –

5

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

OpenCV позволяет вам делать все это, но не является тривиальным, оно требует работы самостоятельно. Я даю вам ключ, сначала вам нужно узнать что-то на сцене, что вы знаете, как оно выглядит, поэтому вы можете рассчитать представление камеры, проанализировав этот объект, назовите его маркером. Вы можете начать с типичных фидуциалов, их легко обнаружить.

Посмотрите на это thread.