他们的论点之间的关系是什么?



希望有更广泛的受众,我把我在answers.opencv.org上问过的问题转发到这里。

TL;DR:传递给undistortPoints, findEssentialMatrecoverPose的参数之间应该保持什么关系

我的程序中有如下代码,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);

I undistort在找到本质矩阵之前的点。文档指出,可以将新的相机矩阵作为最后一个参数传递。当省略时,点在标准化坐标中(介于-1和1之间)。在这种情况下,我希望我将焦距传递1,并将主点传递(0,0)给findEssentialMat,因为这些点是标准化的。所以我认为这是一种方式:

  1. 可能性1 (normalize coordinates)

     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);  
    

然而,我发现,当我告诉undistortPoints旧的相机矩阵仍然有效(我想在这种情况下只有失真被删除)并将参数传递给findEssentialMat时,我只得到合理的结果,就好像这些点被归一化了,它们不是。

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

可能是correctedMatches应该使用(非规范化)图像/像素坐标和基本矩阵调用,而不是E,这可能是我计算中的另一个错误。可以通过F = K^-T * E * K^-1

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

相关内容

  • 没有找到相关文章

最新更新