【问题标题】:OpenCV to OpenGL perspective projection matrix slight errorOpenCV到OpenGL透视投影矩阵轻微错误
【发布时间】: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


【解决方案1】:

我认为造成这种情况的原因是您将每一帧与前一帧进行比较以确定实心立方体应移动到的位置。如果是这种情况,我会尝试将每一帧与第一帧进行比较,以确定立方体应该如何移动。这应该摆脱这种数值漂移。或者,您可以尝试根据检测到黑白标记的位置为每个单独的帧放置实心立方体。

【讨论】:

    猜你喜欢
    • 2013-04-17
    • 1970-01-01
    • 1970-01-01
    • 2015-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多