Opencv中的仿射變換和透射變換
OpenCV提供了一些關於透視變換的介面,例如getPerpectiveTransform, warpPerspective等。這裡主要說明一下warpPerspective是如何工作的。
其實OpenCV中很多影象變換的對映關係都是反直覺的,如這裡的warpPerspective和remap函式。直覺告訴我們,這些函式的輸入是原圖的畫素座標,通過對映表或矩陣運算,輸出的是目標影象的畫素座標。其實不然,OpenCV是先取一個目標影象的座標,然後根據對映關係定位到原圖中去,再從原圖中得到該座標的畫素值。然而通過對映關係得到的座標通常不是一個整數,即並不是原圖的一個畫素座標,所以還需根據原圖中該座標周圍的畫素值用某些插值演算法計算出該座標應有的畫素值。也就是:
對於warpPerspective這個函式,我們已知它表示的對映關係了:
特別提醒,公式裡的x,y是目標影象的座標!那麼我們設原圖座標是xo,yo,則有:
xo=(M11x+M12y+M13)/(M31x+M32y+M33)
yo=(M21x+M22y+M23)/(M31x+M32y+M33)
當我們想計算原圖中某個特定的點在目標影象中的位置時,就需要解這個二元一次方程組了,解得:
x=((M22-M32yo)(M33xo-M13)-(M12-M32xo)(M33yo-M23))/((M22-M32yo)(M11-M31xo)-(M12-M32xo)(M21-M31yo))
y=((M21-M31yo)(M33xo-M13)-(M11-M31xo)(M33yo-M23))/((M21-M31yo)(M12-M32xo)-(M11-M31xo)(M22-M32yo))
透視變換(Perspective Transformation):是將圖片投影到一個新的視平面(Viewing Plane),也稱作投影對映(Projective Mapping)。通用的變換公式為:
u,v是原始圖片左邊,對應得到變換後的圖片座標x,y,其中。 變換矩陣可以拆成4部分,表示線性變換,比如scaling,shearing和ratotion。用於平移,產生透視變換。所以可以理解成仿射等是透視變換的特殊形式。經過透視變換之後的圖片通常不是平行四邊形(除非對映視平面和原來平面平行的情況)