¿Cómo analizar el resultado devuelto por cv::calibrateCamera?
Según el código de ejemplo proporcionado por OpenCV, el rms devuelto por calibrateCamera es el error de reproyección, y el resultado devuelto por computeReprojectionErrors también es el error de reproyección. Hice un experimento y los dos resultados devueltos son básicamente iguales.
Entonces, ¿por qué necesitas ejecutar computeReprojectionErrors?
¿Cómo se puede ver la relación entre rms y totalAvgErr?
rms = cv::calibrateCamera(objectPoints, imagePointsL, imageSize, cameraMatrixL, distcoeffsL, rvecsL, tvecsL, flags);
totalAvgErr = computeReprojectionErrors(objectPoints, imagePointsL, rvecsL, tvecsL, cameraMatrixL, distcoeffsL);
///////////////////////////////////////////////////////////////////////////////////////////////
static double computeReprojectionErrors( const vector<>
const vector<>
const vector
const Mat& cameraMatrix , const Mat& distCoeffs,
vector
{
vector
size_t totalPoints = 0;
double totalErr = 0, err;
perViewErrors.resize(objectPoints.size());
for(size_t i = 0; i < objectPoints.size(); ++i )
{
if (fisheye)
{
fisheye::projectPoints(objectPoints[i], imagePoints2, rvecs[i], tvecs[i], cameraMatrix,
distCoeffs);
}
else
{
projectPoints(objectPoints[i], rvecs[i], tvecs[i], cameraMatrix, distCoeffs, imagePoints2);
}
err = norm(imagePoints[i], imagePoints2, NORM_L2);
size_t n = objectPoints[i].size();
perViewErrors[i] = (float) std::sqrt(err*err/n);
totalErr += err*err;
totalPoints += n;
}
return std::sqrt(totalErr/totalPoints);
}
davy.ai
El
rms
devuelto porcalibrateCamera
es el error de reproyección promedio de todos los puntos en la imagen.computeReprojectionErrors
devuelve el error de reproyección promedio para cada vista, así como el error de reproyección promedio total. Esto le permite ver cómo varía el error de reproyección en diferentes vistas, lo que puede ser útil para la depuración. La relación entrerms
ytotalAvgErr
es quetotalAvgErr
es el promedio de todos losperViewErrors
devueltos porcomputeReprojectionErrors
.