为了希望有更多的读者,我在这里重新发布了我在answers.opencv.org上提问的问题。
TL; DR :传递给undistortPointsfindEssentialMatrecoverPose的参数之间应该保持什么关系?
我的程序中有以下代码,Kdist_coefficients是相机内在函数,而imgpts.匹配了2张图像中的特征点。

     Mat mask; // inlier mask
     undistortPoints(imgpts1, imgpts1, K, dist_coefficients, noArray(), K);
     undistortPoints(imgpts2, imgpts2, K, dist_coefficients, noArray(), K);

     Mat E = findEssentialMat(imgpts1, imgpts2, 1, Point2d(0,0), RANSAC, 0.999, 3, mask);
     correctMatches(E, imgpts1, imgpts2, imgpts1, imgpts2);
     recoverPose(E, imgpts1, imgpts2, R, t, 1.0, Point2d(0,0), mask);
在找到基本矩阵之前,我对这些点进行undistort。该文档指出,可以将新的相机矩阵作为最后一个参数传递。省略时,点位于标准化坐标中(-1和1之间)。在那种情况下,我希望我将焦距传递1,并将主要点传递(0,0)到findEssentialMat,因为这些点已标准化。所以我认为这是这样的:
  • 可能性1 (归一化坐标)
     Mat mask; // inlier mask
     undistortPoints(imgpts1, imgpts1, K, dist_coefficients);
     undistortPoints(imgpts2, imgpts2, K, dist_coefficients);
     Mat E = findEssentialMat(imgpts1, imgpts2, 1.0, Point2d(0,0), RANSAC, 0.999, 3, mask);
     correctMatches(E, imgpts1, imgpts2, imgpts1, imgpts2);
     recoverPose(E, imgpts1, imgpts2, R, t, 1.0, Point2d(0,0), mask);
    
  • 可能性2 (不对坐标进行标准化)
     Mat mask; // inlier mask
     undistortPoints(imgpts1, imgpts1, K, dist_coefficients, noArray(), K);
     undistortPoints(imgpts2, imgpts2, K, dist_coefficients, noArray(), K);
     double focal = K.at<double>(0,0);
     Point2d principalPoint(K.at<double>(0,2), K.at<double>(1,2));
     Mat E = findEssentialMat(imgpts1, imgpts2, focal, principalPoint, RANSAC, 0.999, 3, mask);
     correctMatches(E, imgpts1, imgpts2, imgpts1, imgpts2);
     recoverPose(E, imgpts1, imgpts2, R, t, focal, principalPoint, mask);
    

  • 但是,我发现,只有当我告诉undistortPoints那个旧相机矩阵仍然有效时(我想在那种情况下,只有失真才被删除),然后将参数传递给findEssentialMat,就像这些点已被规范化一样,我才能得到合理的结果。不是。
    这是错误,文档不足还是用户错误?
    更新
    可能应该使用(非规范化的)图像/像素坐标和基本矩阵而不是E来调用correctedMatches,这可能是我计算中的另一个错误。可以通过F = K^-T * E * K^-1获得

    最佳答案

    事实证明,我的数据似乎已关闭。通过使用手动标记的对应关系,我确定可能性1 2 确实是正确的,正如人们所期望的那样。

    关于c++ - undistortPoints,findEssentialMat,recoverPose:它们的参数之间是什么关系?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31290414/

    10-10 16:37