come dice il titolo, la mia domanda riguarda un valore di ritorno dato dalla funzione calibrateCamera di OpenCv.Significato del valore di ritorno di retval in cv2.CalibrateCamera
http://docs.opencv.org/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html
Ho un'implementazione functionnal in Python per trovare i parametri intrinseci ed i coefficienti di distorsione di una macchina fotografica con un nero & griglia bianca.
La domanda riguarda più il valore restituito dalla funzione. Se ho capito correttamente, è "l'errore di riscrittura medio." Questo numero fornisce una buona stima della precisione dei parametri trovati, che dovrebbe essere il più vicino possibile allo zero. " Come citato in
http://docs.opencv.org/doc/tutorials/calib3d/camera_calibration/camera_calibration.html
Che cosa fa esattamente un valore vicino il più vicino possibile allo zero significa?
Ad esempio quando lo faccio mio webcam Logitech:
RMS: matrice 0.702660793513
fotocamera:
[[ 616.30868126 0. 339.02126978]
[ 0. 605.08224927 241.64607568]
[ 0. 0. 1. ]]
Distorsione coefficienti:
[ 0.19805527 -0.62915986 0.00924648 0.02618232 1.02491764]
In questo caso, Come fa l'errore a quantificare la qualità dell'intrinseco p stima degli arametri?
EDIT:
così sono andato alla ricerca di risposte e di scavare un po 'più a fondo e controllando l'attuazione cpp di questa funzione.
Questa è la funzione che calcola il valore di errore:
static double computeReprojectionErrors(
const vector<vector<Point3f> >& objectPoints,
const vector<vector<Point2f> >& imagePoints,
const vector<Mat>& rvecs, const vector<Mat>& tvecs,
const Mat& cameraMatrix, const Mat& distCoeffs,
vector<float>& perViewErrors)
{
vector<Point2f> imagePoints2;
int i, totalPoints = 0;
double totalErr = 0, err;
perViewErrors.resize(objectPoints.size());
for(i = 0; i < (int)objectPoints.size(); i++)
{
projectPoints(Mat(objectPoints[i]), rvecs[i], tvecs[i],
cameraMatrix, distCoeffs, imagePoints2);
err = norm(Mat(imagePoints[i]), Mat(imagePoints2), NORM_L2);
int n = (int)objectPoints[i].size();
perViewErrors[i] = (float)std::sqrt(err*err/n);
totalErr += err*err;
totalPoints += n;
}
return std::sqrt(totalErr/totalPoints);
}
Questo errore viene calcolato considerando i tvecs e rvecs trovati con cv2.CalibrateCamera, esso riproiettare i punti utilizzati per reperire tali vettori di traslazione e rotazione e calcola la distanza euclidea tra il punto riproiettato e le coordinate effettive di quei punti.
Non credo che questo errore sia limitato in [0,1] ma dipende invece dall'intervallo delle coordinate utilizzate per la calibrazione. Quindi dipende dalla risoluzione delle immagini utilizzate per la calibrazione.
Qualcuno può confermare/confutare questo?
[Github openCV per Calibrate Camera:] (https://github.com/Itseez/opencv/blob/master/samples/cpp/calibration.cpp) – David