Преобразование «с высоты птичьего полета» на данном изображении с известными внутренними параметрами c - PullRequest
0 голосов
/ 27 апреля 2020

Я пытаюсь получить трансформацию с высоты птичьего полета на данном изображении. Используя cv2.calibrateCamera и cv2.solvePnPRansac, я знаю внутренние параметры c камеры.

Я нашел много постов, предлагающих много разных ответов, но ни один из них не работал для меня. Некоторые примеры постов, которые я попробовал:

  1. Python создать изображение с новой позицией камеры
  2. Перспектива с высоты птичьего полета из калибровки камеры opencv python
  3. OpenCV: получить перспективную матрицу из перевода и поворота

Ни один из них не работал, некоторые приводили к черным изображениям, в то время как другие в странные перекосы, которые не имеют смысла. Я знаю, что параметры intrinsi c, которые я вычислил, верны, потому что я могу заново спроецировать мою модель на исходные точки изображения.

Матрица камеры для этого изображения:

camera matrix

Вектор вращения:

rotation vector

Вектор перевода:

enter image description here

Последний код, который я использовал, это:

def get_birds_eye_view(image, camera_matrix, rotation_vec, translation_vec):

    dst = np.zeros_like(image)

    dx, dy, dz = translation_vec

    A1= np.matrix([[1, 0, -image.shape[1]/2],
                    [0, 1, -image.shape[0]/2],
                    [0, 0, 0   ],
                    [0, 0, 1   ]])

    T = np.matrix([[1,0,0,dx],
                    [0,1,0,dy],
                    [0,0,1,dz],
                    [0,0,0,1]])

    rotation_matrix = cv2.Rodrigues(rotation_vec)[0]

    rotation_matrix = np.c_[ rotation_matrix, np.zeros(3)]
    rotation_matrix = np.r_[ rotation_matrix, [[0, 0, 0, 1]] ]
    camera_matrix = np.c_[ camera_matrix, np.zeros(3)]

    invers_camera_matrix = np.zeros((4,3))
    invers_camera_matrix[:3,:3] = np.linalg.inv(camera_matrix[:3,:3])
    invers_camera_matrix[-1,:] = [0, 0, 1]

    H = np.linalg.multi_dot([camera_matrix, rotation_matrix, T, invers_camera_matrix])

    warped_image = cv2.warpPerspective(image, H, (image.shape[1], image.shape[0]), dst, cv2.INTER_NEAREST, cv2.BORDER_CONSTANT, 0)

    return warped_image

Пример изображение:

enter image description here

Вывод только черный: enter image description here

Требуемый вывод может выглядеть следующим образом (но с плохой шахматной доской, изображение взято со второй ссылки):

enter image description here

Если какая-либо информация отсутствует, пожалуйста, прокомментируйте, и я предоставлю данные.

...