2015-04-14 14 views
5

Wie der Titel sagt, meine Frage ist über einen Rückgabewert von der CalibrateCamera-Funktion von OpenCv gegeben.Bedeutung der Retval Rückgabewert in cv2.CalibrateCamera

http://docs.opencv.org/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html

Ich habe eine functionnal Implementierung in Python die intrinsischen Parameter und die Distorsion Koeffizienten einer Kamera mit einem Schwarz & Weiß Raster zu finden.

Die Frage ist mehr über das retval, das von der Funktion zurückgegeben wird. Wenn ich richtig verstanden habe, ist es der "durchschnittliche Re-Projection-Fehler. Diese Zahl gibt eine gute Schätzung der Genauigkeit der gefundenen Parameter. Diese sollte so nahe wie möglich bei Null liegen." wie in

erwähnt

http://docs.opencv.org/doc/tutorials/calib3d/camera_calibration/camera_calibration.html

Was genau einen Wert hat der Nähe so nah wie möglich bei Null zu bedeuten?

Zum Beispiel, wenn ich tue es für meine Logitech Webcam:

RMS: 0.702660793513

Kameramatrix:

[[ 616.30868126 0.   339.02126978] 
[ 0.   605.08224927 241.64607568] 
[ 0.   0.   1.  ]] 

Distortion-Koeffizienten:

[ 0.19805527 -0.62915986 0.00924648 0.02618232 1.02491764] 

In diesem Fall Wie quantifiziert der Fehler die Qualität des intrinsischen p? Arameter-Schätzung?

EDIT:

Also ging ich nach Antworten suchen und ein bisschen tiefer und die Überprüfung der CPP-Implementierung dieser Funktion zu graben.

Dies ist die Funktion dieser Fehlerwert-Berechnungs:

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); 
} 

Dieser Fehler berechnet wird, um die tvecs und rvecs mit cv2.CalibrateCamera gefunden bedenkt, ist es die Punkte, die für die Suche nach dieser Translations- und Rotationsvektoren und berechnet Reprojizier verwendet euklidischer Abstand zwischen dem reprojizierten Punkt und den tatsächlichen Koordinaten dieser Punkte.

Ich glaube nicht, dass dieser Fehler in [0,1] begrenzt ist, sondern stattdessen von dem Bereich der Koordinaten abhängt, die für die Kalibrierung verwendet werden. Dies hängt von der Auflösung der für die Kalibrierung verwendeten Bilder ab.

Kann jemand das bestätigen/widerlegen?

+1

[Github openCV für Kamera kalibrieren:] (https://github.com/Itseez/opencv/blob/master/samples/cpp/calibration.cpp) – David

Antwort

6

calibrateCamera liefert den quadratischen Fehler (RMS) Re-Projektion Fehler, normalerweise sollte es zwischen 0,1 und 1,0 Pixel in einer guten Kalibrierung sein.
Die Berechnung wird durch Projizieren der 3D-Schachbrett Punkte (objectPoints) in die Bildebene unter Verwendung des endgültigen Satzes von Kalibrierungsparametern durchgeführt (cameraMatrix, distCoeffs, rvecs und tvecs) und der bekannten Position der Ecken Vergleichen (imagePoints).

Ein RMS-Fehler von 1,0 bedeutet, dass jeder dieser projizierten Punkte durchschnittlich 1,0 px von seiner tatsächlichen Position entfernt ist.Der Fehler ist nicht in [0, 1] begrenzt, er kann als Abstand betrachtet werden.