如何从单应矩阵计算相机姿势?

信息处理 图像处理 计算机视觉 3d opencv
2022-01-18 07:09:20

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

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

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


我找到了一个很好的实现,使用 OpenCV:http ://nghiaho.com/?p=1298

2个回答

即使我的回答对您来说为时已晚,也许其他人会觉得这很有用。我有来自 Homography 的 openCV Pose 代码。我在这个非常有用的网站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]
}

////

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

分解单应性垫

  • Opencv 的函数返回一组可能的旋转、相机法线和平移矩阵。
  • 您必须通过在拍摄第一张图像时将相机法线与相机的相机法线进行比较来选择正确的集合