undistortPoints,findEssentialMat,recoverPose:他们的参数之间有什么关系?

时间:2015-07-08 10:47:05

标签: c++ opencv image-processing camera-calibration 3d-reconstruction

为了吸引更广泛的受众,我在此处转发了我的问题,我也在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点。 doc说明可以将新的相机矩阵作为最后一个参数传递。省略时,点位于标准化坐标(-1和1之间)。在那种情况下,我希望我将焦距传递1,将主点的(0,0)传递给findEssentialMat,因为这些点是标准化的。所以我认为这是方式:

  1. 可能性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. 可能性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);  
    
  3. 然而,我发现,当我告诉undistortPoints旧相机矩阵仍然有效时(我猜在这种情况下只会消除失真)并将参数传递给{{1}时,我才会得到合理的结果好像这些点是标准化的,它们不是。

    这是一个错误,文档不足还是用户错误?

    更新

    可能应该使用(非标准化的)图像/像素坐标和基础矩阵调用findEssentialMat,而不是E,这可能是我计算中的另一个错误。它可以通过correctedMatches

    获得

1 个答案:

答案 0 :(得分:0)

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