, 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ć?
[Github openCV do kalibracji kamery:] (https://github.com/Itseez/opencv/blob/master/samples/cpp/calibration.cpp) – David