Наложение 3D-объектов — дополненная реальность irrlicht + opencv

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

1) Использование opencv: a) Я использовал метод solvepnp, чтобы найти rvecs и tvecs. б) Я также использовал метод родригеса, чтобы найти матрицу вращения, и добавил вектор tvecs, чтобы получить матрицу проекции. в) Просто для тестирования я сделал несколько точек и линий и спроектировал их, чтобы сделать куб. Это прекрасно работает, и я получаю хороший вывод.

2) Используя irrlicht: a) Я попытался разместить 3d-модель (в положении (0,0,0) и вращении (0,0,0)) с камерой, работающей в фоновом режиме. б) Используя матрицу вращения, найденную с помощью родригеса в opencv, я вычислил значения шага, рыскания и крена из этого поста («http://planning.cs.uiuc.edu/node103.html«) и передал значение в поле вращения. В поле позиции я передал значения tvecs. Значения tvecs: tvecs [0], -tvecs [1], tvecs [2].

Модель движется в правильных направлениях, но не движется пропорционально. То есть, если я переместу маркер на 100 пикселей в направлении x, модель переместится только на 20 пикселей (значения 100 и 20 не измерены, я просто взял произвольные значения, чтобы проиллюстрировать пример). Аналогично для оси y и оси z. Я знаю, что должен представить другую матрицу преобразования, которая отображает координаты камеры opencv на координаты камеры irrlicht и ее матрицу 4×4. Но я не знаю, как его найти. Также матрица проекций opencv [R | t] является матрицей 3×4 и дает 2d точку, которая должна быть спроецирована. Для отображения матрицы 4×4 между opencv и irrlicht требуется, чтобы в матрицу 4×4 была введена трехмерная точка (сделанная однородной). Как мне этого добиться?

0

Решение

Матрица 4х4, о которой вы пишете, кажется M=[ R|t; 0 1], t 3×1 вектор перевода. Чтобы получить преобразованные координаты v' 4×1 ([x y z 1] ^ T) точки v просто делать v'=Mt,

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

0

Другие решения