日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

对整个图像进行透视变换

發布時間:2024/1/1 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 对整个图像进行透视变换 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

對整個圖像進行透視變換

    • 透視變換
    • 解決方案

常見的教程都是對所選的四個點內部的區域進行透視變換,但是其他區域都被裁剪掉了。如何利用所選的局部區域對整個圖像進行透視變換?

透視變換

透視變換的算法:OpenCV文檔

dst(x,y)=src(M11x+M12y+M13M31x+M32y+M33,M21x+M22y+M23M31x+M32y+M33)\texttt{dst} (x,y) = \texttt{src} \left ( \frac{M_{11} x + M_{12} y + M_{13}}{M_{31} x + M_{32} y + M_{33}} , \frac{M_{21} x + M_{22} y + M_{23}}{M_{31} x + M_{32} y + M_{33}} \right ) dst(x,y)=src(M31?x+M32?y+M33?M11?x+M12?y+M13??,M31?x+M32?y+M33?M21?x+M22?y+M23??)
推導過程:
通過getPerspectiveTransform()函數得到一個線性變換的矩陣MMM,隨后的透視變換過程如下
[x′y′z′]=[M11M12M13M21M22M23M31M321][xy1]\begin{bmatrix} x' \\ y' \\ z' \end{bmatrix} = \begin{bmatrix} M_{11} & M_{12} & M_{13} \\ M_{21} & M_{22} & M_{23} \\ M_{31} & M_{32} & 1 \\ \end{bmatrix} \begin{bmatrix} x \\ y \\ 1 \end{bmatrix} ???xyz????=???M11?M21?M31??M12?M22?M32??M13?M23?1???????xy1????
由于原始圖像中沒有zzz軸上的維度,所以設置為1,但經過變換后的圖像上的z′z'z不為1,所以將其歸一化,得到
[x′′y′′1]=1z′[x′y′z′]\begin{bmatrix} x'' \\ y'' \\ 1 \end{bmatrix} = \frac{1}{z'} \begin{bmatrix} x' \\ y' \\ z' \end{bmatrix} ???xy1????=z1????xyz????
也就得到了OpenCV的公式

解決方案

解決方案參考:Stack Overflow的方案
被裁剪的原因是因為經過變換的坐標變換到了畫布范圍之外,因此需要確定新畫布的大小,并將變換后的圖像平移到畫布內。
透視變換的矩陣記作M,格式如下:
[M11M12M13M21M22M23M31M321]\begin{bmatrix} M_{11} & M_{12} & M_{13} \\ M_{21} & M_{22} & M_{23} \\ M_{31} & M_{32} & 1 \\ \end{bmatrix} ???M11?M21?M31??M12?M22?M32??M13?M23?1????
設原始圖片的四角分別為

(0,0) ________ (0, w)| ||________| (h,0) (h,w)

只要對四角進行變換,就可以確定新畫布的邊界。
首先坐標點寫作矩陣的形式,三行分別代表x,y,zx,y,zx,y,z軸坐標
P=[0ww000hh1111]P = \begin{bmatrix} 0 & w & w & 0 \\ 0 & 0 & h & h \\ 1 & 1 & 1 & 1 \end{bmatrix} P=???001?w01?wh1?0h1????
類似地,P′=MPP'=MPP=MP,并將P′P'P的各列除以各列的最后一行的那個元素進行歸一化,得到P′′P''P
P′′=[p11p12p13p14p21p22p23p241111]P'' = \begin{bmatrix} p_{11} & p_{12} & p_{13} & p_{14} \\ p_{21} & p_{22} & p_{23} & p_{24} \\ 1 & 1 & 1 & 1 \end{bmatrix} P=???p11?p21?1?p12?p22?1?p13?p23?1?p14?p24?1????
獲取xxx上的(第一行)最大最小值xmin,xmaxx_{min}, x_{max}xmin?,xmax?
獲取yyy上的(第一行)最大最小值ymin,ymaxy_{min}, y_{max}ymin?,ymax?
Δx=xmax?xmin,Δy=ymax?ymin\Delta x= x_{max}-x_{min},\Delta y= y_{max}-y_{min}Δx=xmax??xmin?,Δy=ymax??ymin?即為新畫布的寬和高。


(以上都是基于Stack Overflow上的回答所寫,但正如其中的評論所述,第四步存在錯誤,但評論也表述不太清楚,在此詳細分析一下)

為了進一步將變換后的圖像平移到畫布內,已知了透視變換是通過MMM乘以坐標進行的,可以對MMM進行更改來加入平移操作。
創建單位矩陣,并在第三列放入矩陣P′′P''P對應行的最小值的負值,稱為矩陣TTT
T=[10?xmin01?ymin001]T= \begin{bmatrix} 1 & 0 & -x_{min}\\ 0 & 1 & -y_{min} \\ 0 & 0 & 1 \end{bmatrix} T=???100?010??xmin??ymin?1????
則新的變換矩陣M′=TMM'=TMM=TM。可以簡單驗證一下,將M′M'M與坐標相乘并展開,可以發現剛好得到
[x′′′y′′′1]=[x′′?xminy′′?ymin1]\begin{bmatrix} x''' \\ y''' \\ 1 \end{bmatrix}= \begin{bmatrix} x''-x_{min} \\ y''-y_{min} \\ 1 \end{bmatrix} ???xy1????=???x?xmin?y?ymin?1????
因此最后的透視變換的參數為:
warpPerspective(src=src, M=M', dsize=(delta_x, delta_y))

總結

以上是生活随笔為你收集整理的对整个图像进行透视变换的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。