我试图使用openCVs找到两个匹配的点集的基本矩阵找到findFundamentalMat()。图像失真,然后我检测到关键点并匹配它们。我认为使用undistortPoints会给我更好的基本矩阵结果(我知道我的相机的内在参数),但是在undistortPoints之后,findFundamentalMat给出了奇怪的结果。 首先,在得到的掩模阵列中,所有点都被认为是内点。 其次,错误非常高。 我像这样计算错误:
vector<Point2f> points1Raw; //Raw points from Keypoints
vector<Point2f> points1; //Undistorted points
vector<Point2f> points2Raw;
vector<Point2f> points2;
for(int k=0; k<matches.size(); k++) {
points1Raw.push_back(keypoints1[matches[k].queryIdx].pt);
points2Raw.push_back(keypoints2[matches[k].trainIdx].pt);
};
undistortPoints(points1Raw, points1, cameraMatrixm, distCoeffsm);
undistortPoints(points2Raw, points2, cameraMatrixm, distCoeffsm);
vector<uchar> states;
Mat f = findFundamentalMat(points1, points2, FM_RANSAC, 3, 0.99, states);
//For all k matches
Mat p1(3, 1, CV_64F);
p1.at<double>(0, 0) = points1[k].x;
p1.at<double>(1, 0) = points1[k].y;
p1.at<double>(2, 0) = 1;
Mat p2(1, 3, CV_64F);
p2.at<double>(0, 0) = points2[k].x;
p2.at<double>(0, 1) = points2[k].y;
p2.at<double>(0, 2) = 1;
Mat res = abs(p2 * f * p1); // f computed matrix
if((bool)states[k]) //if match considered inlier (in my strange case all)
err = err + res.at<double>(0, 0); //accumulate errors
总结果错误类似于100到1000甚至更多。但是通过在计算基本矩阵之前手动检查匹配,大多数似乎都是正确的。 我究竟做错了什么? :/
答案 0 :(得分:2)
你有多少分?要算作inlier,允许误差达到(在你的情况下)3个像素,...所以如果你有几百个点,很明显累积误差很大。
答案 1 :(得分:0)
在undistortPoints之后,坐标不再以像素为单位,因此 3 没有多大意义。您可以尝试使用:
0.006 * maxVal
喜欢: http://www.learningace.com/doc/568776/daa602b585fb296681f344b08bc808f0/snavely_ijcv07第4.1节
double minVal, maxVal;
cv::minMaxIdx(points1, &minVal, &maxVal);