From 3fd07809c93ceb26783c29d81dd943fa3db73df5 Mon Sep 17 00:00:00 2001 From: Vadim Pisarevsky Date: Tue, 30 Nov 2010 10:27:34 +0000 Subject: [PATCH] make cv::calibrateCamera, cv::stereoCalibrate and their C counterparts return the standard RMS error. --- modules/calib3d/src/calibration.cpp | 4 ++-- samples/cpp/calibration.cpp | 11 ++++++----- samples/cpp/stereo_calib.cpp | 4 ++-- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/modules/calib3d/src/calibration.cpp b/modules/calib3d/src/calibration.cpp index 06cc00c..eabb0a6 100644 --- a/modules/calib3d/src/calibration.cpp +++ b/modules/calib3d/src/calibration.cpp @@ -1742,7 +1742,7 @@ CV_IMPL double cvCalibrateCamera2( const CvMat* objectPoints, } } - return reprojErr; + return std::sqrt(reprojErr/total); } @@ -2254,7 +2254,7 @@ double cvStereoCalibrate( const CvMat* _objectPoints, const CvMat* _imagePoints1 } } - return reprojErr; + return std::sqrt(reprojErr/(pointsTotal*2)); } diff --git a/samples/cpp/calibration.cpp b/samples/cpp/calibration.cpp index 7fb12ee..fe2e346 100644 --- a/samples/cpp/calibration.cpp +++ b/samples/cpp/calibration.cpp @@ -91,14 +91,14 @@ static double computeReprojectionErrors( { projectPoints(Mat(objectPoints[i]), rvecs[i], tvecs[i], cameraMatrix, distCoeffs, imagePoints2); - err = norm(Mat(imagePoints[i]), Mat(imagePoints2), CV_L1 ); + err = norm(Mat(imagePoints[i]), Mat(imagePoints2), CV_L2); int n = (int)objectPoints[i].size(); - perViewErrors[i] = (float)(err/n); - totalErr += err; + perViewErrors[i] = (float)std::sqrt(err*err/n); + totalErr += err*err; totalPoints += n; } - return totalErr/totalPoints; + return std::sqrt(totalErr/totalPoints); } static void calcChessboardCorners(Size boardSize, float squareSize, vector& corners) @@ -130,9 +130,10 @@ static bool runCalibration( vector > imagePoints, objectPoints.resize(imagePoints.size(),objectPoints[0]); - calibrateCamera(objectPoints, imagePoints, imageSize, cameraMatrix, + double rms = calibrateCamera(objectPoints, imagePoints, imageSize, cameraMatrix, distCoeffs, rvecs, tvecs, flags|CV_CALIB_FIX_K4|CV_CALIB_FIX_K5); ///*|CV_CALIB_FIX_K3*/|CV_CALIB_FIX_K4|CV_CALIB_FIX_K5); + printf("RMS error reported by calibrateCamera: %g\n", rms); bool ok = checkRange(cameraMatrix) && checkRange(distCoeffs); diff --git a/samples/cpp/stereo_calib.cpp b/samples/cpp/stereo_calib.cpp index 74778a7..6b1bf27 100644 --- a/samples/cpp/stereo_calib.cpp +++ b/samples/cpp/stereo_calib.cpp @@ -162,7 +162,7 @@ StereoCalib(const vector& imagelist, Size boardSize, bool useCalibrated= cameraMatrix[1] = Mat::eye(3, 3, CV_64F); Mat R, T, E, F; - stereoCalibrate(objectPoints, imagePoints[0], imagePoints[1], + double rms = stereoCalibrate(objectPoints, imagePoints[0], imagePoints[1], cameraMatrix[0], distCoeffs[0], cameraMatrix[1], distCoeffs[1], imageSize, R, T, E, F, @@ -170,7 +170,7 @@ StereoCalib(const vector& imagelist, Size boardSize, bool useCalibrated= CV_CALIB_FIX_ASPECT_RATIO + CV_CALIB_ZERO_TANGENT_DIST + CV_CALIB_SAME_FOCAL_LENGTH); - cout << "done\n"; + cout << "done with RMS error=" << rms << endl; // CALIBRATION QUALITY CHECK // because the output fundamental matrix implicitly -- 2.7.4