OpenCV findFundamentalMat奇怪的行为

时间:2013-01-09 12:55:03

标签: c++ opencv

我试图使用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甚至更多。但是通过在计算基本矩阵之前手动检查匹配,大多数似乎都是正确的。 我究竟做错了什么? :/

2 个答案:

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