2015-04-14 13 views
5

, jak mówi tytuł, moje pytanie dotyczy wartości zwracanej przez funkcję calibrateCamera z OpenCv.Znaczenie powrotnej wartości powrotnej w cv2.CalibrateCamera

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

Mam functionnal wdrożenia w Pythonie, aby znaleźć wewnętrzne parametry i współczynniki zniekształcenia aparatu przy użyciu czarnego & białą kratkę.

Pytanie dotyczy raczej zwrotu zwracanego przez funkcję. Jeśli dobrze zrozumiałem, to jest to "średni błąd re-projekcji." Ta liczba daje dobre oszacowanie dokładności znalezionych parametrów, powinno być możliwie jak najbliżej zera. " jak wymieniono w

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

Co dokładnie ma wartość bliską zeru tak blisko, jak to możliwe na myśli?

Na przykład, kiedy robię to dla mojej kamery Logitech:

RMS: macierz 0.702660793513

kamery:

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

Distortion współczynniki:

[ 0.19805527 -0.62915986 0.00924648 0.02618232 1.02491764] 

w tym przypadku, W jaki sposób błąd kwantyfikuje jakość nieodłącznego p oszacowanie średnic?

EDIT:

więc poszedłem szuka odpowiedzi i kopanie nieco głębiej i sprawdzanie realizacji cpp tej funkcji.

Jest to funkcja obliczania tej wartości o błędzie:

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

Ten błąd jest obliczana z uwzględnieniem tvecs i rvecs znaleziono cv2.CalibrateCamera, to odwzorować punkty posłużyć do znalezienia tych translacji i rotacji wektory i oblicza odległość euklidesowa między zrerojektowanym punktem a rzeczywistymi współrzędnymi tych punktów.

Nie sądzę, że ten błąd jest ograniczony w [0,1], ale zamiast tego jest on zależny od zakresu współrzędnych użytych do kalibracji. Jest to zależne od rozdzielczości obrazów użytych do kalibracji.

Czy ktoś może to potwierdzić/obalić?

+1

[Github openCV do kalibracji kamery:] (https://github.com/Itseez/opencv/blob/master/samples/cpp/calibration.cpp) – David

Odpowiedz

6

calibrateCamera zwraca błąd średniokwadratowy (RMS), zwykle powinien wynosić od 0,1 do 1,0 piksela przy dobrej kalibracji.
Obliczenia wykonywane przez rzutowanie punktów 3D szachownicy (objectPoints) w płaszczyźnie obrazu stosując jako końcowy zestaw parametrów kalibracyjnych (cameraMatrix, distCoeffs, rvecs i tvecs) i porównując ze znanym położenie naroży (imagePoints).

Błąd RMS wynoszący 1,0 oznacza, że ​​przeciętnie każdy z tych rzutowanych punktów znajduje się w odległości 1,0 px od rzeczywistej pozycji.Błąd nie jest ograniczony w [0, 1], można go traktować jako odległość.

Powiązane problemy