python opencv實(shí)現(xiàn)任意角度的透視變換實(shí)例代碼
本文主要分享的是一則python+opencv實(shí)現(xiàn)任意角度的透視變換的實(shí)例,具體如下:
# -*- coding:utf-8 -*-
import cv2
import numpy as np
def rad(x):
return x * np.pi / 180
img = cv2.imread("6.jfif")
cv2.imshow("original", img)
# 擴(kuò)展圖像,保證內(nèi)容不超出可視范圍
img = cv2.copyMakeBorder(img, 200, 200, 200, 200, cv2.BORDER_CONSTANT, 0)
w, h = img.shape[0:2]
anglex = 0
angley = 30
anglez = 0 #是旋轉(zhuǎn)
fov = 42
while 1:
# 鏡頭與圖像間的距離,21為半可視角,算z的距離是為了保證在此可視角度下恰好顯示整幅圖像
z = np.sqrt(w ** 2 + h ** 2) / 2 / np.tan(rad(fov / 2))
# 齊次變換矩陣
rx = np.array([[1, 0, 0, 0],
[0, np.cos(rad(anglex)), -np.sin(rad(anglex)), 0],
[0, -np.sin(rad(anglex)), np.cos(rad(anglex)), 0, ],
[0, 0, 0, 1]], np.float32)
ry = np.array([[np.cos(rad(angley)), 0, np.sin(rad(angley)), 0],
[0, 1, 0, 0],
[-np.sin(rad(angley)), 0, np.cos(rad(angley)), 0, ],
[0, 0, 0, 1]], np.float32)
rz = np.array([[np.cos(rad(anglez)), np.sin(rad(anglez)), 0, 0],
[-np.sin(rad(anglez)), np.cos(rad(anglez)), 0, 0],
[0, 0, 1, 0],
[0, 0, 0, 1]], np.float32)
r = rx.dot(ry).dot(rz)
# 四對(duì)點(diǎn)的生成
pcenter = np.array([h / 2, w / 2, 0, 0], np.float32)
p1 = np.array([0, 0, 0, 0], np.float32) - pcenter
p2 = np.array([w, 0, 0, 0], np.float32) - pcenter
p3 = np.array([0, h, 0, 0], np.float32) - pcenter
p4 = np.array([w, h, 0, 0], np.float32) - pcenter
dst1 = r.dot(p1)
dst2 = r.dot(p2)
dst3 = r.dot(p3)
dst4 = r.dot(p4)
list_dst = [dst1, dst2, dst3, dst4]
org = np.array([[0, 0],
[w, 0],
[0, h],
[w, h]], np.float32)
dst = np.zeros((4, 2), np.float32)
# 投影至成像平面
for i in range(4):
dst[i, 0] = list_dst[i][0] * z / (z - list_dst[i][2]) + pcenter[0]
dst[i, 1] = list_dst[i][1] * z / (z - list_dst[i][2]) + pcenter[1]
warpR = cv2.getPerspectiveTransform(org, dst)
result = cv2.warpPerspective(img, warpR, (h, w))
cv2.imshow("result", result)
c = cv2.waitKey(30)
# anglex += 3 #auto rotate
# anglez += 1 #auto rotate
# angley += 2 #auto rotate
# 鍵盤控制
if 27 == c: # Esc quit
break;
if c == ord('w'):
anglex += 1
if c == ord('s'):
anglex -= 1
if c == ord('a'):
angley += 1
# dx=0
if c == ord('d'):
angley -= 1
if c == ord('u'):
anglez += 1
if c == ord('p'):
anglez -= 1
if c == ord('t'):
fov += 1
if c == ord('r'):
fov -= 1
if c == ord(' '):
anglex = angley = anglez = 0
if c == ord('q'):
print("======================================")
print('旋轉(zhuǎn)矩陣:\n', r)
print("angle alpha: ", anglex, 'angle beta: ', angley, "dz: ", anglez, ": ", z)
cv2.destroyAllWindows()
總結(jié)
以上就是本文關(guān)于python opencv實(shí)現(xiàn)任意角度的透視變換實(shí)例代碼的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對(duì)本站的支持!
相關(guān)文章
Pandas數(shù)據(jù)集的合并與連接merge()方法
Pandas數(shù)據(jù)集的合并與連接(merge())是數(shù)據(jù)處理過程中常用的操作之一,在使用Pandas進(jìn)行數(shù)據(jù)集合并時(shí),可以使用merge()函數(shù)將兩個(gè)或多個(gè)數(shù)據(jù)集按照指定的列進(jìn)行合并,本文就來(lái)介紹一下,感興趣的可以了解一下2023-11-11
如何利用Python開發(fā)一個(gè)簡(jiǎn)單的猜數(shù)字游戲
這篇文章主要給大家介紹了關(guān)于如何利用Python開發(fā)一個(gè)簡(jiǎn)單的猜數(shù)字游戲的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
使用PyCharm配合部署Python的Django框架的配置紀(jì)實(shí)
這篇文章主要介紹了使用PyCharm配合部署Python的Django框架的配置紀(jì)實(shí),PyCharm是一款強(qiáng)大的Python的IDE,需要的朋友可以參考下2015-11-11
JSON文件及Python對(duì)JSON文件的讀寫操作
JSON和XML都是互聯(lián)網(wǎng)上數(shù)據(jù)交換的主要載體。這篇文章主要介紹了JSON文件及Python對(duì)JSON文件的讀寫操作,需要的朋友可以參考下2018-10-10
python添加列表元素append(),extend()及?insert()
這篇文章主要介紹了python添加列表元素append(),extend()及?insert(),列表是儲(chǔ)存元素的數(shù)據(jù)類型,既然能存儲(chǔ)元素,那么就類似數(shù)據(jù)庫(kù)一樣,增刪改查的一些功能就不能少了。下面我們就來(lái)先看看添加列表元素方法有哪些,需要的朋友可以參考一下2022-03-03
Python編寫可視化界面的全過程(Python+PyCharm+PyQt)
這篇文章主要給大家介紹了關(guān)于Python編寫可視化界面的相關(guān)資料,主要使用了Python+PyCharm+PyQt,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2021-05-05
關(guān)于Python自動(dòng)化操作Excel
這篇文章主要介紹了關(guān)于Python自動(dòng)化操作Excel, Python 是一種功能強(qiáng)大的編程語(yǔ)言,可以用于許多任務(wù),包括處理 Excel 文件,需要的朋友可以參考下2023-04-04

