Низкое среднеквадратичное значение при калибровке одной камеры и высокое среднеквадратичное значение при стереокалибровке

Я пытаюсь откалибровать стереоустановку, состоящую из двух одинаковых Canon EOS60D, которые я буду использовать для фотограмметрии. Для калибровки камер я использую высокоточную circlegrid шаблонную пластину. Я смог определить центральные точки кругов, используя cv2.findCirclesGrid, и смог отлично откалибровать одну камеру. Проблема возникает, когда я пытаюсь откалибровать обе камеры, используя функцию cv2.stereoCalibrate в OpenCV. Я объясню предпринятые шаги, а также опубликую некоторые фрагменты кода с выводами, которые у меня есть. Буду благодарен, если кто-нибудь подскажет, где я не прав.

Шаги

1) Первый шаг — определить шаблон круговой сетки с помощью функции cv2.findCirclesGrid в OpenCV.

2) Затем, используя обнаруженный шаблон сетки с каждой камеры, я использую cv2.calibrateCamera для получения матриц камер и коэффициентов искажения обеих камер.

3) Получив матрицы камер и коэффициенты дисторсии обеих камер, я передаю их в функцию cv2.stereoCalibrate.

Вывод

вывод после калибровки левой камеры выглядит следующим образом

Left Camera Return Value :  0.202690712694
Left Camera Camera Matrix :  [[  2.42046647e+04   0.00000000e+00       1.78281995e+03]
[  0.00000000e+00   2.42115121e+04   2.51720578e+03]
[  0.00000000e+00   0.00000000e+00   1.00000000e+00]]
Left Camera Dist Coeff :  [[-0.09448288 -1.38934436  0.00951455 -0.00568115  0.11248399]]

вывод после калибровки правой камеры выглядит следующим образом

Right Camera Return value :  0.258429588138
Right Camera Camera Matrix :  [[  2.69094574e+04   0.00000000e+00   1.70580157e+03]
[  0.00000000e+00   2.69534209e+04   2.55185400e+03]
[  0.00000000e+00   0.00000000e+00   1.00000000e+00]]
Right Camera Dist Coeff :  [[-0.1854594   1.89124255  0.00592814 -0.00377697  0.05715002]]

Как видно из приведенного выше вывода, оба возвращаемых значения из cv2.calibrateCamera являются разумными.

вывод после калибровки стереоустановки выглядит следующим образом

StereoCalib Return Value :  278.98818985
Rotation Vector :  [[ 0.72415334  0.13289823  0.67671265]
[ 0.68078781  0.018949   -0.73223554]
[-0.11013584  0.99094853 -0.07675351]]
Translation Vector  [[-1.20860215]
[ 1.23017549]
[ 2.08116679]]
Essential Matrix :  [[-1.55231939  1.17960457  1.42948401]
[ 1.37397347  1.47424592  1.31558743]
[-1.7136373  -0.18638995  0.05250614]]
Fundamental Matrix :  [[ -3.15554184e-07   2.39721211e-07   6.99264445e-03]
[  2.78844610e-07   2.99110045e-07   5.21248054e-03]
[ -9.54712002e-03  -2.19149124e-03   1.00000000e+00]]

Но возвращаемое значение стереокалибровки слишком велико.

Параметры

Флаги и критерии, которые я использую в cv2.stereoCalibrate, следующие:

flags = cv2.CALIB_FIX_INTRINSIC

criteria = cv2.TERM_CRITERIA_MAX_ITER + cv2.TERM_CRITERIA_EPS, 1000, 1e-6

Я был бы признателен, если бы кто-нибудь мог указать мне, где я делаю неправильно.


person the_parzival    schedule 30.08.2017    source источник
comment
Привет @the_parzival У меня такая же проблема. Вам удалось это решить?   -  person Mikel Díez Buil    schedule 01.06.2018
comment
@MikelDíezBuil Мне не удалось решить эту проблему, но я смог уменьшить ее, изменив поворот между кадрами. Вы можете следовать некоторым хорошим правилам, которым следует следовать при выполнении калибровки. ссылка   -  person the_parzival    schedule 03.06.2018