天天看點

opencv仿射變換和透視變換(一)理論篇

一、話說仿射變換和透視變換

對于平面區域,有兩種方式的幾何轉換:一種是基于2×3矩陣進行的變換,叫仿射變換;另一種是基于3×3矩陣進行的變換,叫透視變換或者單應性映射。關于仿射變換和透射變換的矩陣變換,這篇博文不做重點讨論,因為圖像本質就是矩陣,對矩陣的變換就是對圖像像素的操作,很簡單的數學知識。

仿射變換可以形象的表示成以下形式。一個平面内的任意平行四邊形ABCD可以被仿射變換映射為另一個平行四邊形A’B’C’D’。通俗的解釋就是,可以将仿射變換想象成一幅圖像畫到一個膠版上,在膠版的角上推或拉,使其變形而得到不同類型的平行四邊形。相比較仿射變換,透射變換更具有靈活性,一個透射變換可以将矩形轉變成梯形。如下圖:

opencv仿射變換和透視變換(一)理論篇

1.1 仿射變換的API

void cvWarpAffine(    const CvArr* src,//輸入圖像    CvArr* dst,//輸出圖像    const CvMat* map_matrix,//2×3變換矩陣->傳個矩陣進來?    int flags=CV_INTER_LINEAR|CV_WARP_FILL_OUTLIERS,//插值方法    CvScalar fillval=cvScalarAll(0))

從上面的函數中,我們可以看到其中需要傳進去一個2×3變換矩陣,是以我們在調用cvWarpAffine()函數之前,要計算仿射映射矩陣,是以在OpenCV中有函數cvGetAffineTransform()來計算仿射映射矩陣。

CvMat* cvGetAffineTransform(    const CvPoint2D32f* pts_src,    const CvPoint2D32f* pts_dst,//src,dst三個二維點(x,y)的數組    CvMat* map_matrix//得到的仿射映射矩陣參數)

另一個擷取變換矩陣的方法

CV_EXPORTS_W Mat getRotationMatrix2D( Point2f center, double angle, double scale );

1.2 透視變換API

CV_EXPORTS Mat getPerspectiveTransform( const Point2f src[], const Point2f dst[] );

void warpPerspective( InputArray src, OutputArray dst,

                                  InputArray M, Size dsize,

                                  int flags = INTER_LINEAR,

                                  int borderMode = BORDER_CONSTANT,

                                  const Scalar& borderValue = Scalar());

1.3 二者的聯系

仿射變換:二維空間的變換 ; 線性變換 ;已知3對坐标點就可以求得變換矩陣

透視變換:三維空間的變換 ; 非線性變換 ;已知4對坐标點可以求得變換矩陣

二、重點講透視變換

透視變換(Perspective Transformation)是将圖檔投影到一個新的視平面(Viewing Plane),也稱作投影映射(Projective Mapping)。我們知道在圖像的仿射變換中需要變換矩陣是一個2x3的兩維平面變換矩陣,而透視變換本質上空間立體三維變換,根據其次坐标方差,要把三維坐标投影到另外一個視平面,就需要一個完全不同的變換矩陣M,是以這個是透視變換跟OpenCV中幾何仿射變換最大的不同。

OpenCV中透視變換的又分為兩種:1稀疏透視變換 ,2密集透視變換

opencv仿射變換和透視變換(一)理論篇

重寫之前的變換公式可以得到:

opencv仿射變換和透視變換(一)理論篇

是以,已知變換對應的幾個點就可以求取變換公式。反之,特定的變換公式也能新的變換後的圖檔。

簡單的看一個正方形到四邊形的變換:

變換的4組對應點可以表示成:

opencv仿射變換和透視變換(一)理論篇

根據變換公式得到:

opencv仿射變換和透視變換(一)理論篇

定義幾個輔助變量:

opencv仿射變換和透視變換(一)理論篇

都為0時變換平面與原來是平行的,可以得到:

opencv仿射變換和透視變換(一)理論篇

不為0時,得到:

opencv仿射變換和透視變換(一)理論篇

求解出的變換矩陣就可以将一個正方形變換到四邊形。反之,四邊形變換到正方形也是一樣的。于是,我們通過兩次變換:四邊形變換到正方形+正方形變換到四邊形就可以将任意一個四邊形變換到另一個四邊形。

opencv仿射變換和透視變換(一)理論篇

opencv中相關API函數:

計算透視矩陣(通過輸入和輸出圖像中兩組點計算透視矩陣):

findHomography( InputArray srcPoints, InputArray dstPoints,

                              OutputArray mask, int method = 0, double ransacReprojThreshold = 3 );

圖像的透視變換(利用透視矩陣對圖像進行透視變換):

warpPerspective( InputArray src, OutputArray dst,

點的透視變換(利用透視矩陣對點進行透視變換):

perspectiveTransform(InputArray src, OutputArray dst, InputArray m );

---

參考文獻

https://blog.csdn.net/zhangjunp3/article/details/80036310 https://blog.csdn.net/qq_24946843/article/details/82697364 https://blog.csdn.net/zhangjunp3/article/details/80318533

繼續閱讀