如何从同形矩阵计算相机姿态?


13

假设我只使用一台校准相机。从这台摄像机,我得到图像A和B。我知道A和B之间的单应性,这是通过OpenCVfindHomography()计算得出的

我知道图像A的姿态(旋转矩阵R和平移矢量t),并且我需要图像B的姿态。一旦获得它,我想我将能够计算后续图像的每一个进一步的姿态。

您知道计算B的姿势的实现吗?我在网上找到了几篇文章,但找不到易于实施的解决方案...


我不确定我是否了解如何使用您的代码。我使用OpenCV来检索Homography,但是当我通过算法发送该Homography时,它总是返回此内容。cameraPose [1、0、0、0; 0,1,0,0;
0,0,1,0

Answers:


8

即使我的回答对您来说太迟了,也许其他人也觉得这很有用。我有来自Homography的openCV姿势的代码。我在这个非常有用的网站euclideanspace上找到了该方法。

void cameraPoseFromHomography(const Mat& H, Mat& pose)
{
    pose = Mat::eye(3, 4, CV_64FC1); //3x4 matrix
    float norm1 = (float)norm(H.col(0)); 
    float norm2 = (float)norm(H.col(1));
    float tnorm = (norm1 + norm2) / 2.0f;

    Mat v1 = H.col(0);
    Mat v2 = pose.col(0);

    cv::normalize(v1, v2); // Normalize the rotation

    v1 = H.col(1);
    v2 = pose.col(1);

    cv::normalize(v1, v2);

    v1 = pose.col(0);
    v2 = pose.col(1);

    Mat v3 = v1.cross(v2);  //Computes the cross-product of v1 and v2
    Mat c2 = pose.col(2);
    v3.copyTo(c2);      

    pose.col(3) = H.col(2) / tnorm; //vector t [R|t]
}

////


我已经在代码中使用了您的函数。使用这种方法计算出的姿势矩阵始终为[1 0 0 0; 0 1 0 0; 0 0 1 0; 0 0 0 0]。你有什么解释吗?
Muhammet Ali Asan 2015年

您是否使用A的姿势?看来您只在使用输入H
Guig

即使使用直接从已知姿势计算的单应性矩阵,该方法也不是很准确。但是,使用迭代过程可以改善结果,在迭代过程中,您可以从估计的姿态中获取矩阵,然后将其求逆并将其应用于原始输入。从此残差单应性中获取姿势参数,更新姿势估计等,直到收敛为止。
除以零


0

您可以使用在Opencv 3.0+中实现的同构分解方法

分解单眼垫

  • Opencv的函数返回一组可能的旋转,相机法线和平移矩阵。
  • 您必须通过比较相机法线和相机拍摄第一张图像时的相机法线来选择正确的组。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.