Commit 3fd07809 authored by Vadim Pisarevsky's avatar Vadim Pisarevsky

make cv::calibrateCamera, cv::stereoCalibrate and their C counterparts return…

make cv::calibrateCamera, cv::stereoCalibrate and their C counterparts return the standard RMS error.
parent 8754caff
...@@ -1742,7 +1742,7 @@ CV_IMPL double cvCalibrateCamera2( const CvMat* objectPoints, ...@@ -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 ...@@ -2254,7 +2254,7 @@ double cvStereoCalibrate( const CvMat* _objectPoints, const CvMat* _imagePoints1
} }
} }
return reprojErr; return std::sqrt(reprojErr/(pointsTotal*2));
} }
......
...@@ -91,14 +91,14 @@ static double computeReprojectionErrors( ...@@ -91,14 +91,14 @@ static double computeReprojectionErrors(
{ {
projectPoints(Mat(objectPoints[i]), rvecs[i], tvecs[i], projectPoints(Mat(objectPoints[i]), rvecs[i], tvecs[i],
cameraMatrix, distCoeffs, imagePoints2); 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(); int n = (int)objectPoints[i].size();
perViewErrors[i] = (float)(err/n); perViewErrors[i] = (float)std::sqrt(err*err/n);
totalErr += err; totalErr += err*err;
totalPoints += n; totalPoints += n;
} }
return totalErr/totalPoints; return std::sqrt(totalErr/totalPoints);
} }
static void calcChessboardCorners(Size boardSize, float squareSize, vector<Point3f>& corners) static void calcChessboardCorners(Size boardSize, float squareSize, vector<Point3f>& corners)
...@@ -130,9 +130,10 @@ static bool runCalibration( vector<vector<Point2f> > imagePoints, ...@@ -130,9 +130,10 @@ static bool runCalibration( vector<vector<Point2f> > imagePoints,
objectPoints.resize(imagePoints.size(),objectPoints[0]); 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); distCoeffs, rvecs, tvecs, flags|CV_CALIB_FIX_K4|CV_CALIB_FIX_K5);
///*|CV_CALIB_FIX_K3*/|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); bool ok = checkRange(cameraMatrix) && checkRange(distCoeffs);
......
...@@ -162,7 +162,7 @@ StereoCalib(const vector<string>& imagelist, Size boardSize, bool useCalibrated= ...@@ -162,7 +162,7 @@ StereoCalib(const vector<string>& imagelist, Size boardSize, bool useCalibrated=
cameraMatrix[1] = Mat::eye(3, 3, CV_64F); cameraMatrix[1] = Mat::eye(3, 3, CV_64F);
Mat R, T, E, F; Mat R, T, E, F;
stereoCalibrate(objectPoints, imagePoints[0], imagePoints[1], double rms = stereoCalibrate(objectPoints, imagePoints[0], imagePoints[1],
cameraMatrix[0], distCoeffs[0], cameraMatrix[0], distCoeffs[0],
cameraMatrix[1], distCoeffs[1], cameraMatrix[1], distCoeffs[1],
imageSize, R, T, E, F, imageSize, R, T, E, F,
...@@ -170,7 +170,7 @@ StereoCalib(const vector<string>& imagelist, Size boardSize, bool useCalibrated= ...@@ -170,7 +170,7 @@ StereoCalib(const vector<string>& imagelist, Size boardSize, bool useCalibrated=
CV_CALIB_FIX_ASPECT_RATIO + CV_CALIB_FIX_ASPECT_RATIO +
CV_CALIB_ZERO_TANGENT_DIST + CV_CALIB_ZERO_TANGENT_DIST +
CV_CALIB_SAME_FOCAL_LENGTH); CV_CALIB_SAME_FOCAL_LENGTH);
cout << "done\n"; cout << "done with RMS error=" << rms << endl;
// CALIBRATION QUALITY CHECK // CALIBRATION QUALITY CHECK
// because the output fundamental matrix implicitly // because the output fundamental matrix implicitly
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment