Bedeutung des retval Rückgabewertes in cv2.CalibrateCamera

Wie der Titel sagt, handelt es sich bei meiner Frage um einen Rückgabewert der calibrateCamera-Funktion von OpenCv.

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

Ich habe eine funktionale Implementierung in Python, um die intrinsischen Parameter und die Distorsionskoeffizienten einer Kamera mit einem Black & White Raster zu finden.

Die Frage ist mehr über die von der Funktion zurückgegebene retval. Wenn ich es richtig verstanden habe, ist es der "durchschnittliche Neuprojektionsfehler". Diese Zahl gibt eine gute Einschätzung der Genauigkeit der gefundenen Parameter, die so nahe wie möglich an Null liegen sollte. " Wie erwähnt in

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

Was genau bedeutet ein Wert nahe so nah wie möglich?

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

RMS: 0.702660793513

Kameramatrix:

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

Verzerrungskoeffizienten:

 [ 0.19805527 -0.62915986 0.00924648 0.02618232 1.02491764] 

In diesem Fall, wie korrigiert der Fehler die Qualität der intrinsischen Parameterschätzung?

BEARBEITEN:

Also ging ich auf der Suche nach Antworten und graben ein bisschen tiefer und Überprüfung der cpp Umsetzung dieser Funktion.

Dies ist die Funktion, die diesen Fehlerwert berechnet:

 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 wird unter Berücksichtigung der tvcs und rvecs, die mit cv2.CalibrateCamera gefunden werden, repliziert, sie reproject die Punkte, die verwendet werden, um diese Translations- und Rotationsvektoren zu finden, und berechnet den euklidischen 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 abhängig von der Reichweite der für die Kalibrierung verwendeten Koordinaten ist. Es hängt also von der Auflösung der für die Kalibrierung verwendeten Bilder ab.

Kann jemand das bestätigen / widerlegen?

One Solution collect form web for “Bedeutung des retval Rückgabewertes in cv2.CalibrateCamera”

calibrateCamera gibt den root mean square (RMS) Reprojektion Fehler, in der Regel sollte es zwischen 0,1 und 1,0 Pixel in einer guten Kalibrierung.
Die Berechnung erfolgt durch die Projektion der 3D-Schachbrettstellen ( objectPoints ) in die Bildebene mit dem letzten Satz von Kalibrierparametern ( cameraMatrix , distCoeffs , rvecs und tvecs ) und Vergleich der bekannten Position der Ecken ( imagePoints ).

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

  • Wie konvertiert man ein Graustufenbild in RGB in OpenCV (Python) zur Visualisierung von Konturen nach der Bearbeitung eines Bildes im Binär?
  • Wie entdecke ich einen Weihnachtsbaum?
  • Cv2.drawContours zeichnet nicht gefüllte Kontur
  • Python - Extrahieren und Speichern von Videorahmen
  • OpenCV python's API: FlannBasedMatcher
  • OpenCV läuft beim Speichern von Videodateien aus dem Speicher
  • Installieren von opencv für python auf außenseiter
  • Opencv 3.0 python imshow error
  • Angeforderte Module nicht verfügbar: vtkRenderingOpenGL-cmake / OpenCVDetectVTK.cmake: 6 (find_package)
  • Wie konvertiere ich ein Bild von np.uint16 zu np.uint8?
  • OpenCV putText () neues Zeilenzeichen
  • Python ist die beste Programmiersprache der Welt.