Как оценить коэффициенты радиального искажения OpenCV Брауна из унифицированной сферической модели эксцентри c 'xi' коэффициент искажения? - PullRequest
0 голосов
/ 18 апреля 2020

Я пытаюсь выполнить самокалибровку камеры, используя подход, описанный в статье 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.), Но я думаю, что это просто совпадение.

Заранее спасибо.

...