Спасибо за ваш ответ. Я специально хочу найти решение от внешних параметров камеры. Таким образом, ваша вторая рекомендация не подходит для приложения. Как вы упомянули, я опробовал учебник, но я не могу воспроизвести ваши результаты. В частности, 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 дал мне другой результатВсе еще не результат, который я ищу!