es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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<> >& objectPoints,
const vector<> >& imagePoints,
const vector& rvecs, const vector& tvecs,
const Mat& cameraMatrix , const Mat& distCoeffs,
vector& perViewErrors, bool fisheye)
{
vector imagePoints2;
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);

}

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El rms devuelto por calibrateCamera 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 entre rms y totalAvgErr es que totalAvgErr es el promedio de todos los perViewErrors devueltos por computeReprojectionErrors.

Comments are closed.