undistortPoints、findEssentialMat、recoverPose:它们的参数之间有什么关系?
undistortPoints, findEssentialMat, recoverPose: What is the relation between their arguments?
为了更广泛的受众,我在这里重新发布了我在 answers.opencv.org 上提出的问题。
TL;DR:传递给 undistortPoints
、findEssentialMat
和 recoverPose
的参数之间应该保持什么关系?
我的程序中有如下代码,K
和 dist_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
就好像这些点被归一化了,但事实并非如此。
这是错误、文档不足还是用户错误?
更新
可能 correctedMatches
应该用(非标准化的)image/pixel 坐标和基本矩阵调用,而不是 E,这可能是我计算中的另一个错误。可以通过F = K^-T * E * K^-1
获得
事实证明,我的数据似乎已关闭。通过使用手动标记的对应关系,我确定 Possibility 1 和 2 确实是正确的,正如人们所期望的那样。
为了更广泛的受众,我在这里重新发布了我在 answers.opencv.org 上提出的问题。
TL;DR:传递给 undistortPoints
、findEssentialMat
和 recoverPose
的参数之间应该保持什么关系?
我的程序中有如下代码,K
和 dist_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
就好像这些点被归一化了,但事实并非如此。
这是错误、文档不足还是用户错误?
更新
可能 correctedMatches
应该用(非标准化的)image/pixel 坐标和基本矩阵调用,而不是 E,这可能是我计算中的另一个错误。可以通过F = K^-T * E * K^-1
事实证明,我的数据似乎已关闭。通过使用手动标记的对应关系,我确定 Possibility 1 和 2 确实是正确的,正如人们所期望的那样。