Я пытаюсь получить преобразование перспективы с высоты птичьего полета на основе внутренних и внешних матриц камеры и коэффициентов искажения.
Я попробовал использовать ответ из этого вопроса.
Использованное изображение — это образец изображения left02.jpg из официального репозитория opencv на github

Я откалибровал камеру и нашел внутреннюю, внешнюю матрицы и коэффициенты искажения.
Я не искажал изображение и нашел позу. Чтобы проверить правильность параметров.

Уравнения, которые я использовал для нахождения матрицы преобразования перспективы (см. ссылку выше):
Hr = K * R.inv() * K.inv() где R — матрица вращения (из cv2.Rodrigues()), а K получена из cv2.getoptimalnewcameramatrix() [ 1 0 | ] Хт знак равно [ 0 1 | -K*C/Cz ] [ 0 0 | ] Где C=-R.inv()*T Где T — вектор трансляции из cv2.solvePnP() а Cz — 3-я компонента вектора C
Необходимое преобразование: H = Ht * Hr
Код, который я использовал для построения приведенного выше уравнения:
K = newcameramtx # из cv2.getoptimalnewcameramatrix() ret,rvec,tvec = cv2.solvePnP(world_points,corners2,K,dist) R,_ = cv2.Родригес(rvec) _,R_inv = cv2.invert(R) _,K_inv = cv2.invert(K) Hr = np.matmul(K,np.matmul(R_inv,K_inv)) C = np.matmul(-R_inv,tvec) Сз = С[2] temp_vector = np.matmul(-K,C/Cz) Ht = np.identity(3) для я, значение в перечислении (temp_vector): Ht[2] = значение гомография = np.matmul(Ht,Hr) warped_img =cv2.warpPerspective(img,homography,(img.shape[1],img.shape[0])) # где img — это неискаженное изображение выше с визуализированной позой Полученное искаженное изображение неверно.

Если я удалю перевод из гомографии, используя приведенный ниже код
homography = Hr.copy() warped_img =cv2.warpPerspective(img,homography,(img.shape[1],img.shape[0])) Я получаю следующее изображение

Я думаю, что на изображении выше показано, что моя часть вращения верна, но мой перевод неверен.
Поскольку трансляционная матрица (Ht) является расширенной матрицей, я не уверен, правильна ли моя конструкция приведенной выше матрицы.
Я специально хочу выяснить преобразование перспективы с высоты птичьего полета на основе калибровки камеры.
Итак, как мне исправить приведенные выше уравнения, чтобы получить идеальное изображение шахматной доски с высоты птичьего полета?
Может ли кто-нибудь объяснить, как получаются приведенные выше уравнения для Ht и Hr? Я не особо знаком с линейной алгеброй, поэтому эти уравнения для меня не очень очевидны.
ОБНОВЛЕНИЕ:
homography = np.matmul(Ht,Hr) warped_img =cv2.warpPerspective(img,homography,(img.shape[1],img.shape[0]),flags=cv2.WARP_INVERSE_MAP) Флаг cv2.WARP_INVERSE_MAP дал мне другой результат

Все еще не тот результат, который мне нужен!