【发布时间】:2016-12-21 08:08:39
【问题描述】:
我一直在努力尝试正确获取 opengl 的透视投影矩阵。使用opencv,我可以完美地在标记上覆盖一个立方体(红色线网)。但是,当我按如下方式从帖子 (http://www.morethantechnical.com/2015/02/17/augmented-reality-on-libqglviewer-and-opencv-opengl-tips-wcode/) 应用 opencv-opengl 透视投影时,标记上会覆盖一个实心立方体,但是当我旋转标记时,实心立方体会慢慢移出标记(@987654322 @red cube (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)。
【问题讨论】:
-
您确定问题出在透视投影矩阵上吗?两个立方体看起来都处于相似的角度。我认为问题可能出在您的模型视图矩阵和坐标系的变化上。
标签: c++ opencv opengl augmented-reality projection