Спасибо за ваш ответ. Я специально хочу найти решение от внешних параметров камеры. Таким образом, ваша вторая рекомендация не подходит для приложения. Как вы упомянули, я опробовал учебник, но я не могу воспроизвести ваши результаты. В частности, R2 я дал в качестве матрицы, которую вы дали (вращение для птичьего полета). Как выбрать tvec2? Я сделал tvec2 = tvec2, чтобы дать некоторые результаты, но они не соответствуют вашим результатам. Вы не против поделиться кодом C ++, который вы использовали для получения результатов выше ?, Спасибо

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

Я пытался использовать ответ отэто вопрос.

Используемое изображение - пример изображения left02.jpg из официального репозитория github opencv

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

Я отменил изображение и нашел позу. Проверить правильность параметров.

Уравнения, которые я использовал, чтобы найти матрицу преобразования перспективы: (см. Ссылку выше):

Hr = K * R.inv() * K.inv() где R - вращательная матрица (из cv2.Rodrigues ()), а K - из cv2.getoptimalnewcameramatrix ()

     [ 1  0  |         ]
Ht = [ 0  1  | -K*C/Cz ]
     [ 0  0  |         ]

гдеC=-R.inv()*T Где T - поступательный вектор изcv2.solvePnP() и Cz является третьим компонентом вектора C

Требуемое преобразование:H = Ht * Hr

Код, который я использовал для построения приведенного выше уравнения:

K = newcameramtx # from cv2.getoptimalnewcameramatrix()
ret,rvec,tvec = cv2.solvePnP(world_points,corners2,K,dist) 
R,_ = cv2.Rodrigues(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)
Cz = C[2]
temp_vector = np.matmul(-K,C/Cz)
Ht = np.identity(3)
for i,val in enumerate(temp_vector):
    Ht[i][2] = val
homography = np.matmul(Ht,Hr)
warped_img =cv2.warpPerspective(img,homography,(img.shape[1],img.shape[0]))
# where img is the above undistored image with visualized pose

Полученное искаженное изображение не является правильным.

Если я удалю перевод из омографии, используя приведенный ниже код

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 дал мне другой результат

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