OpenCV仿射變換與透視變換區別

轉自:https://blog.csdn.net/flyyufenfei/article/details/80208361

仿射變換

1) 用途
旋轉 (線性變換),平移 (向量加).縮放(線性變換),錯切,反轉

2) 方法
仿射變換是一種二維座標到二維座標之間的線性變換,它保持了二維圖形的“平直性”(直線經過變換之後依然是直線)和“平行性”(二維圖形之間的相對位置關係保持不變,平行線依然是平行線,且直線上點的位置順序不變)。任意的仿射變換都能表示爲乘以一個矩陣(線性變換),再加上一個向量 (平移) 的形式.
這裏寫圖片描述
以上公式將點(x,y)映射到(x’,y’),在OpenCV中通過指定一個2x3矩陣實現此功能(公式中的m矩陣,是線性變換和平移的組合,m11,m12,m21,m22爲線性變化參數,m13,m23爲平移參數,其最後一行固定爲0,0,1,因此,將3x3矩陣簡化爲2x3)

3) 舉例
a) 以原點爲中心旋轉,2x3矩陣爲:
[ cos(theta), -sin(theta), 0 ],
[ sin(theta), cos(theta), 0 ]

x’ = x * cos(theta) - sin(theta) * y
y’ = x * sin(theta) + cos(theta) * y

b) 平移,2x3矩陣爲
[1,0,tx],
[0,1,ty]

x’ = x * 1 + y * 0 + tx = x + tx
y’ = x * 0 + y * 1 + ty = y + ty

4) 具體應用
在OpenCV中,仿射變換通過函數cvWrapAffine(src,dst,mat)實現,其中mat是2x3的仿射矩陣,該矩陣可以利用函數cvGetAffineTransform(srcTri,dstTri,mat)得到,其中mat是被該函數填充的仿射矩陣,srcTri和dstTri分別是由三個頂點定義的平行四邊形(由於是平行四邊形,只需要指定三個頂點即可確定),即:給出變換前的ABCD和變換後的A’B’C’D’
這裏寫圖片描述

透視變換(投影變換)

1) 用途
將2D矩陣圖像變換成3D的空間顯示效果,全景拼接.

2) 方法
透視變換是將圖片投影到一個新的視平面,也稱作投影映射.它是二維(x,y)到三維(X,Y,Z),再到另一個二維(x’,y’)空間的映射.
相對於仿射變換,它提供了更大的靈活性,將一個四邊形區域映射到另一個四邊形區域(不一定是平行四邊形).它不止是線性變換.但也是通過矩陣乘法實現的,使用的是一個3x3的矩陣,矩陣的前兩行與仿射矩陣相同(m11,m12,m13,m21,m22,m23),也實現了線性變換和平移,第三行用於實現透視變換.
這裏寫圖片描述
以上公式設變換之前的點是z值爲1的點,它三維平面上的值是x,y,1,在二維平面上的投影是x,y,通過矩陣變換成三維中的點X,Y,Z,再通過除以三維中Z軸的值,轉換成二維中的點x’,y’.
從以上公式可知,仿射變換是透視變換的一種特殊情況.它把二維轉到三維,變換後,再轉映射回之前的二維空間(而不是另一個二維空間).

3) 具體應用
在OpenCV中,透視變換通過函數cvWrapPerspective(src,dst,mat)實現, 與仿射變換不同的是,透視矩陣是一個3x3的矩陣,在計算矩陣時,可利用函數cvGetPerspectiveTransform(srcQuad,dstQuad,mat),由於不再是平行四邊形,需要提供四邊形的四個頂點
這裏寫圖片描述

區別

仿射變換後平行四邊形的各邊仍操持平行,透視變換結果允許是梯形等四邊形,所以仿射變換是透視變換的子集

實例:
1. 仿射變換 https://blog.csdn.net/augusdi/article/details/9022447
2. 透視變換 https://blog.csdn.net/Augusdi/article/details/9022197

轉載自:

https://blog.csdn.net/xieyan0811/article/details/71106539

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章