2015-04-14 14 views
5

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?

+1

[Github openCV per Calibrate Camera:] (https://github.com/Itseez/opencv/blob/master/samples/cpp/calibration.cpp) – David

risposta

6

calibrateCamera restituisce l'errore di re-proiezione della media quadrata (RMS), in genere deve essere compreso tra 0,1 e 1,0 pixel in una buona calibrazione.
Il calcolo è fatto proiettando i punti scacchiera 3D (objectPoints) nel piano dell'immagine utilizzando il set di parametri di calibrazione finale (cameraMatrix, distCoeffs, rvecs e tvecs) e confrontando la posizione nota degli angoli (imagePoints).

Un errore RMS pari a 1.0 significa che, in media, ciascuno di questi punti proiettati è a una distanza di 1,0 px dalla sua posizione effettiva.L'errore non è limitato in [0, 1], può essere considerato come una distanza.

Problemi correlati