2013-01-09 139 views
3

我正在嘗試使用openCVs find findFundamentalMat()獲取兩個匹配點集的基本矩陣。圖像失真,然後我檢測到關鍵點並匹配這些關鍵點。我認爲使用undistortPoints會給我更好的基礎矩陣結果(我知道我的相機的內在參數),但在unsistortPoints之後,findFundamentalMat會給出奇怪的結果。首先,在得到的掩模陣列中,所有點都被視爲內點。 二,錯誤非常高。 我計算誤差是這樣的:OpenCV 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

你有幾點?要算作inlier,允許出現錯誤(在你的情況下)3像素,所以如果你有幾百個點,很明顯累積誤差很大。

+0

謝謝,我會考慮這樣做。正如你所說,可能圖像的失真很好,因此所有的點都是內點,但每個點都有錯誤。我以某種方式沒有看到這種方式。 – Teris