Стереокалибровка: отображение между системами координат камер - PullRequest
0 голосов
/ 08 октября 2018

Мне нужно найти отображение между системами координат двух камер.У меня есть две внутренние камеры, которые были вычислены ранее, поэтому я установил для них стереокалибровка с установленным флагом cv2.CALIB_FIX_INTRINSIC .

reprojErr, _, _, _, _, R, T, E, F = cv2.stereoCalibrate(objectPoints, imagePoints1, imagePoints2, cameraMatrix1, distCoeffs1, cameraMatrix2, distCoeffs2, imageShape, flags=cv2.CALIB_FIX_INTRINSIC)

где: objectPoints - это массив точек шахматной доски в координатном пространстве объекта, imagePoints1 , imagePoints2 - это массивы позиций внутренних углов шахматной доски на соответствующих изображениях с 1-го и 2-гокамеры соответственно.

После обработки ~ 50 пар соответствующих изображений, я получаю огромную ошибку перепроецирования (> 10), для меньшего количества (~ 10) изображений эта ошибка достаточно мала.Все изображения имеют четко видимую шахматную доску, которая правильно обнаружена: correctly detected chessboards

Теперь рассмотрим следующую выдержку из кода Python:

_, rvec1, tvec1, _ = cv2.solvePnPRansac(objectPoints, imagePoints1, cameraMatrix1, distCoeffs1)
rvec2 = np.matmul(R, rvec1)
tvec2 = np.matmul(R, tvec1) + T
_, rvec2_ref, tvec2_ref, _ = cv2.solvePnPRansac(objectPoints, imagePoints2, cameraMatrix2, distCoeffs2)

Я ожидаючто rvec2 и tvec2 равны (достаточно близки) к rvec2_ref и tvec2_ref соответственно.По какой-то причине это неправда, независимо от того, насколько велика ошибка репроекции, возвращаемая стереоКалибрат .Для визуальной проверки я рисую спроецированный кадр из 3 ортогональных векторов (2, охватывающих плоскость шахматной доски + ее нормаль), используя rvec2 и tvec2 (рис. Справа): terrible transformation result

Весь код калибровки доступен здесь .Можете ли вы сказать мне, что не так и как я могу это исправить?Все советы приветствуются.

...