2016-12-01 2 views
0

У меня две камеры установлены горизонтально (близко друг к другу). Я оставил камеру cam1 и правую камеру cam2.Высокая ошибка RMS во время «онлайн» cv: stereoCalibration

Сначала я калибровать камеры (я хочу, чтобы откалибровать 50 пар изображений):

  1. калибровать обе камеры separetely используя резюме :: calibrateCamera()
  2. откалибровать стерео, используя резюме :: stereoCalibrate()

Мои вопросы:

  1. В stereoCalibrate - я предположил, что порядок камер данные важны. Если данные с левой камеры должны быть imagePoints1 и с правой камеры, это должны быть imagePoints2 или наоборот, или это не имеет значения, если порядок камер одинаковый в каждой точке программы?
  2. В stereoCalibrate - я получаю ошибку RMS около 15,9319 и среднюю ошибку перепрограммирования около 8,4536. Я получаю эти значения, если я использую все изображения с камер. В другом случае: сначала я сохраняю изображения, я выбираю пары, где видна вся шахматная доска (все квадраты шахматной доски находятся в режиме просмотра камеры, и каждый квадрат видим полностью). Я получаю RMS около 0,7. Если это означает, что только автономная калибровка хороша, и если я хочу откалибровать камеру, я должен выбрать хорошие изображения вручную? Или есть способ сделать онлайн-калибровку? В Интернете я имею в виду, что я начинаю захват с камеры, и на каждом изображении я нашел углы шахматной доски и после просмотра стоп-кадра с камеры я откалибрую камеру.
  3. Мне нужно всего четыре значения искажений, но я получаю пять из них (с 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); 

ответ

0

У меня была аналогичная проблема. Моя проблема заключалась в том, что я читал левые изображения и правильные изображения, предполагая, что оба они были отсортированы. Здесь часть кода в Python исправлена ​​с помощью «сортировки» во второй строке.

images = glob.glob(path_left) 
for fname in sorted(images): 
    img = cv2.imread(fname) 
    gray1 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 
    # Find the chess board corners 
    ret, corners1 = cv2.findChessboardCorners(gray1, (n, m), None) 
    # If found, add object points, image points (after refining them) 
    if ret == True: 
     i = i + 1 
     print("Cam1. Chess pattern was detected") 
     objpoints1.append(objp) 
     cv2.cornerSubPix(gray1, corners1, (5, 5), (-1, -1), criteria) 
     imgpoints1.append(corners1) 
     cv2.drawChessboardCorners(img, (n, m), corners1, ret) 
     cv2.imshow('img', img) 
     cv2.waitKey(100)