Я пытаюсь выполнить самокалибровку камеры, используя подход, описанный в статье DeepCalib: A Deep Learning Approach for Automatic Intrinsic Calibration of Wide Field-of-View Cameras
в Python.
При наличии одного входного изображения NN возвращает приблизительное фокусное расстояние изображения и предполагаемое искажение xi
коэффициент. xi
(xi греческое письмо) происходит от унифицированной сферической модели, описанной в статье Mei-Rives
.
Код, предоставленный авторами статьи DeepCalib на GitHub, в порядке, он может неискажать изображения с помощью этого xi
coeff., Но он не вычисляет выходной размер неискаженного изображения (только приблизительная его величина), следовательно, в зависимости от входного изображения, он возвратит неискаженное изображение с большой черной рамкой вокруг него или возвратит обрезанное изображение.
Я бы хотел решить эту проблему, используя cv2.undistort
функцию OpenCV, но мне нужно преобразовать этот xi
коэффициент. в кортеже коэффициентов искажения Брауна OpenCV [k1, k2, 0, 0, k3]
(два нуля для тангенциальных компонентов).
Как я могу это сделать?
Что я на самом деле делаю:
def convert_xi_into_opencv_brown_tuple(xi):
xi_conv = xi / 1.12 # obtained experimentally
return np.array([-xi_conv, xi_conv, 0, 0, -xi_conv])
dist_coeffs = convert_xi_into_opencv_brown_tuple(xi)
# Intrinsic matrix
K = np.array([[f_est, 0, u0_est], [0, f_est, v0_est], [0, 0, 1]])
h, w = distorted_image.shape[:2]
newcameramtx, roi = cv2.getOptimalNewCameraMatrix(K, dist_coeffs, (w, h), 1, (w, h))
im_undist = cv2.undistort(distorted_image, K, dist, None, newcameramtx)
Кажется, что он работает с моими изображениями (почти такой же результат с оригинальным искажением alg.), Но я думаю, что это просто совпадение.
Заранее спасибо.