Небольшая ошибка матрицы перспективной проекции OpenCV в OpenGL

Я боролся с попытками получить матрицу перспективной проекции для opengl правильно. Используя opencv, я могу наложить куб (красная сетка) на маркер отлично. Однако, когда я применяю перспективную проекцию opencv-opengl из поста (http://www.morethantechnical.com/2015/02/17/augmented-reality-on-libqglviewer-and-opencv-opengl-tips-wcode/) следующим образом, твердый куб накладывается на маркер, однако, когда я поворачиваю маркер, твердый куб медленно смещается из маркера (https://www.youtube.com/watch?v=m87qAZcN6c4&Функция = youtu.be) .The красный куб (wiremesh) был нарисован с использованием opencv, и он отлично наложен.

// perspective projection matrix*************************
double fx = intrinsic_matrix.at<double>(0,0);
double fy = intrinsic_matrix.at<double>(1,1);
double cx = intrinsic_matrix.at<double>(0,2);
double cy = intrinsic_matrix.at<double>(1,2);
projection.at<double>(0,0) = fx/cx;
projection.at<double>(1,1) = fy/cy;
projection.at<double>(2,2) = -(far+near)/(far-near);
projection.at<double>(2,3) = -2.0*far*near / (far-near);
projection.at<double>(3,2) = -1.0;

projection = projection.t();

// modelview matrix **********************************************
modelview.at<double>(0,0) = rotation.at<double>(0,0);
modelview.at<double>(1,0) = rotation.at<double>(1,0);
modelview.at<double>(2,0) = rotation.at<double>(2,0);
modelview.at<double>(3,0) = 0;

modelview.at<double>(0,1) = rotation.at<double>(0,1);
modelview.at<double>(1,1) = rotation.at<double>(1,1);
modelview.at<double>(2,1) = rotation.at<double>(2,1);
modelview.at<double>(3,1) = 0;

modelview.at<double>(0,2) = rotation.at<double>(0,2);
modelview.at<double>(1,2) = rotation.at<double>(1,2);
modelview.at<double>(2,2) = rotation.at<double>(2,2);
modelview.at<double>(3,2) = 0;

modelview.at<double>(0,3) = tvecs.at<double>(0);
modelview.at<double>(1,3) = tvecs.at<double>(1);
modelview.at<double>(2,3) = tvecs.at<double>(2);
modelview.at<double>(3,3) = 1;

// This matrix corresponds to the change of coordinate systems.
static double changeCoordArray[4][4] = {{1, 0, 0, 0}, {0, -1, 0, 0}, {0, 0, -1, 0}, {0, 0, 0, 1}};
static Mat changeCoord(4, 4, CV_64FC1, changeCoordArray);

modelview = changeCoord*modelview;
modelview = modelview.t();

Кто-нибудь может мне помочь исправить это? Вот мой код (http://pastebin.com/2MkQvkdN).

-1

Решение

Я думаю, что причина этого в том, что вы сравниваете каждый кадр с предыдущим, чтобы определить, куда должен переместиться сплошной куб. Если это так, я бы попробовал сравнить каждый кадр с первым, чтобы определить, как должен двигаться куб. Это должно избавить от этого численного дрейфа. В качестве альтернативы, вы можете попробовать разместить сплошной куб для каждого отдельного кадра, в зависимости от того, где вы обнаружите черно-белые маркеры.

0

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

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector