У меня две камеры установлены горизонтально (близко друг к другу). Я оставил камеру cam1 и правую камеру cam2.Высокая ошибка RMS во время «онлайн» cv: stereoCalibration
Сначала я калибровать камеры (я хочу, чтобы откалибровать 50 пар изображений):
- калибровать обе камеры separetely используя резюме :: calibrateCamera()
- откалибровать стерео, используя резюме :: stereoCalibrate()
Мои вопросы:
- В stereoCalibrate - я предположил, что порядок камер данные важны. Если данные с левой камеры должны быть imagePoints1 и с правой камеры, это должны быть imagePoints2 или наоборот, или это не имеет значения, если порядок камер одинаковый в каждой точке программы?
- В stereoCalibrate - я получаю ошибку RMS около 15,9319 и среднюю ошибку перепрограммирования около 8,4536. Я получаю эти значения, если я использую все изображения с камер. В другом случае: сначала я сохраняю изображения, я выбираю пары, где видна вся шахматная доска (все квадраты шахматной доски находятся в режиме просмотра камеры, и каждый квадрат видим полностью). Я получаю RMS около 0,7. Если это означает, что только автономная калибровка хороша, и если я хочу откалибровать камеру, я должен выбрать хорошие изображения вручную? Или есть способ сделать онлайн-калибровку? В Интернете я имею в виду, что я начинаю захват с камеры, и на каждом изображении я нашел углы шахматной доски и после просмотра стоп-кадра с камеры я откалибрую камеру.
- Мне нужно всего четыре значения искажений, но я получаю пять из них (с k3). В старой версии api cvStereoCalibrate2 у меня есть только четыре значения, но в cv :: stereoCalibrate я не знаю, как это сделать? Возможно ли это, или единственный способ получить 5 значений и использовать только четыре из них позже?
Мой код:
Mat cameraMatrix[2], distCoeffs[2];
distCoeffs[0] = Mat(4, 1, CV_64F);
distCoeffs[1] = Mat(4, 1, CV_64F);
vector<Mat> rvec1, rvec2, tvec1, tvec2;
double rms1 = cv::calibrateCamera(objectPoints, imagePoints[0], imageSize, cameraMatrix[0], distCoeffs[0],rvec1, tvec1, CALIB_FIX_K3, TermCriteria(
TermCriteria::COUNT+TermCriteria::EPS, 30, DBL_EPSILON));
double rms2 = cv::calibrateCamera(objectPoints, imagePoints[1], imageSize, cameraMatrix[1], distCoeffs[1],rvec2, tvec2, CALIB_FIX_K3, TermCriteria(
TermCriteria::COUNT+TermCriteria::EPS, 30, DBL_EPSILON));
qDebug()<<"Rms1: "<<rms1;
qDebug()<<"Rms2: "<<rms2;
Mat R, T, E, F;
double rms = cv::stereoCalibrate(objectPoints, imagePoints[0], imagePoints[1],
cameraMatrix[0], distCoeffs[0],
cameraMatrix[1], distCoeffs[1],
imageSize, R, T, E, F,
TermCriteria(CV_TERMCRIT_ITER+CV_TERMCRIT_EPS, 100, 1e-5),
CV_CALIB_FIX_INTRINSIC+
CV_CALIB_SAME_FOCAL_LENGTH);