OpenCV 透視變換
1. 簡介
汽車的360度全景影像,從拍照視角變成鳥瞰圖
這種變換常常用到透視變換
在了解透視變換前,需要了解一下其他的變換,包括 平移,旋轉(zhuǎn),放縮,錯切,以及仿射變換
2. 仿射變換
2.1. 平移
對每一個像素點坐標(biāo)平移
可以讓每一個像素點的x,y 坐標(biāo)都加一個變量 T
矩陣形式表示:
等式左邊[X,Y,1]是像素坐標(biāo)的齊次形式
等式右邊是平移之后的坐標(biāo)
from cv2 import cv2import numpy as np# 讀取圖片文件demo_file_path = 'img.png'img = cv2.imdecode(np.fromfile(demo_file_path, dtype=np.uint8), cv2.IMREAD_UNCHANGED)cv2.imshow('origin img', img)# 平移變量T_x, T_y = 10, 20# 構(gòu)造移動矩陣H 2*3H = np.float32([[1, 0, T_x],[0, 1, T_y]])
2.2. 旋轉(zhuǎn)
對每一個像素點坐標(biāo)旋轉(zhuǎn)
假設(shè)初始旋轉(zhuǎn)角度為 ?,可以用(1,0)和(0,1)基向量旋轉(zhuǎn)理解
矩陣形式表示:
from cv2 import cv2import numpy as np# 讀取圖片文件demo_file_path = 'img.png'img = cv2.imdecode(np.fromfile(demo_file_path, dtype=np.uint8), cv2.IMREAD_UNCHANGED)cv2.imshow('origin img', img)# 旋轉(zhuǎn)變量 30°sin_phi, cos_phi = 0.5, 0.866# 構(gòu)造旋轉(zhuǎn)矩陣H 2*3H = np.float32([[cos_phi, -sin_phi, 0],[sin_phi, cos_phi, 0]])
2.3. 放縮
進行放縮,就是將矩形(圖像)放縮n倍,也就是長寬各乘一個變量
矩陣形式表示:
from cv2 import cv2import numpy as np# 讀取圖片文件demo_file_path = 'img.png'img = cv2.imdecode(np.fromfile(demo_file_path, dtype=np.uint8), cv2.IMREAD_UNCHANGED)cv2.imshow('origin img', img)# 縮放變量N_x, N_y = 0.9, 0.8# 構(gòu)造縮放矩陣H 2*3H = np.float32([[N_x, 0, 0],[0, N_y, 0]])
2.4. 錯切
錯切是在某方向上,按照一定的比例對圖形的每個點到某條平行于該方向的直線的有向距離做放縮得到的平面圖形
X軸上的錯切:
Y軸上的錯切:
整合起來即:
from cv2 import cv2import numpy as np# 讀取圖片文件demo_file_path = 'img.png'img = cv2.imdecode(np.fromfile(demo_file_path, dtype=np.uint8), cv2.IMREAD_UNCHANGED)cv2.imshow('origin img', img)# 錯切變量 10° 20°tan_theta, tan_varphi = 0.176, 0.364# 構(gòu)造錯切矩陣H 2*3H = np.float32([[1, tan_theta, 0],[tan_varphi, 1, 0]])
2.5. 仿射變換
仿射變換矩陣,是由原圖像平移,旋轉(zhuǎn),放縮,錯切之后得來的,即
如果用2*2的矩陣和2D坐標(biāo)表示,無法將平移和其他操作一起運算,那么需要“升維”
引入“齊次坐標(biāo)”,將圖像從平面2D坐標(biāo)變成3D坐標(biāo)
把縮放,旋轉(zhuǎn),平移等變換都統(tǒng)一起來,都表示成一連串的矩陣相乘的形式,保證了形式上的線性一致性
目的主要是合并矩陣運算中的乘法和加法
將矩形變換成平行四邊形(即變換后各邊依舊平行)
上面公式里有六個變量,因此自然需要至少列六個等式才可計算出該矩陣
所以需要輸入至少三對點集
from cv2 import cv2import numpy as np# 讀取圖片文件demo_file_path = 'img.png'img = cv2.imdecode(np.fromfile(demo_file_path, dtype=np.uint8), cv2.IMREAD_UNCHANGED)cv2.imshow('origin img', img)# 定義對應(yīng)的點 原始1(書本的3個角落坐標(biāo))、變換2pts1 = np.float32([[290, 9], [6, 348], [328, 353]])pts2 = np.float32([[280, 0], [0, 350], [280, 350]])# 計算得到轉(zhuǎn)換矩陣 2*2
3. 透視變換
常見的有文檔矯正和汽車攝像頭轉(zhuǎn)成鳥瞰圖,因為視角的原因,近處寬遠處窄,呈不規(guī)則的四邊形
仿射變換是單純對圖片進行平移,縮放,錯切(傾斜)和旋轉(zhuǎn),而這幾個操作都不會改變圖片線之間的平行關(guān)系
仿射變換是在二維空間中,而透視變換則是在三維空間中視角的變化
T1為線性變換完成旋轉(zhuǎn),錯切和放縮,T2完成平移操作,T3就是設(shè)了兩個變量來表示映射關(guān)系
需要選取原圖上的四個點以上的點集,并計算出該點集變換后的位置
from cv2 import cv2import numpy as np# 讀取圖片文件demo_file_path = 'img.png'img = cv2.imdecode(np.fromfile(demo_file_path, dtype=np.uint8), cv2.IMREAD_UNCHANGED)cv2.imshow('origin img', img)# 定義對應(yīng)的點 原始1(書本的4個角落坐標(biāo))、變換2pts1 = np.float32([[49, 14], [290, 9], [6, 348], [328, 353]])pts2 = np.float32([[0, 0], [280, 0], [0, 350], [280, 350]])# 計算得到轉(zhuǎn)換矩陣 3*3M = cv2.getPerspectiveTransform(pts1, pts2)
版權(quán)聲明:本文為CSDN博主「氫鍵H-H」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:
https://blog.csdn.net/qq_32618327/article/details/128085686
編輯:古月居
聲明:部分內(nèi)容來源于網(wǎng)絡(luò),僅供讀者學(xué)習(xí)、交流之目的文章版權(quán)歸原作者所有。如有不妥,請聯(lián)系刪除。
