上一篇我們學習了仿射變換的warpAffine函數,知道了如何用這個函數對圖像進行旋轉、平移等操作,那麼本節我們一起來學習一下與仿射變換相關的其他函數以及相關的幾何圖像變換。
一、convertMaps()函數
1、函數原型
void convertMaps(InputArray map1, InputArray map2, OutputArray dstmap1, OutputArray dstmap2, int dstmap1type, bool nninterpolation = false);
2、函數功能
将圖檔的變換映射從一種形式轉換為另一種形式。
格式如下:
( (map1.type(), map2.type()) → (dstmap1.type(), dstmap2.type()) )
會支援下面的幾種操作:
- (CV_32FC1, CV_32FC1)→(CV_16SC2, CV_16UC1)
這是一種最常用的轉換操作,将原圖浮點映射轉換為更為緊促和更快的頂點表示!第一個輸出裡面存儲圓角坐标,第二個輸出存儲插值表中的索引(當函數的參數nninterpolation = false時建立);
- (CV_32FC2)→(CV_16SC2, CV_16UC1)
與第一種類似,但是原圖映射在一個2通道的矩陣中;
- 反向轉換,顯然,重建的浮點映射與原圖的浮點映射不會完全相同!
3、參數詳解
- 第一個參數,InputArray map1,第一個輸入映射,一般它的類型為 CV_16SC2, CV_32FC1, or CV_32FC2;
- 第二個參數,InputArray map2,第二個輸入映射,一般它的類型為CV_16UC1, CV_32FC1,以及空的矩陣(none);
- 第三個參數,OutputArray dstmap1,第一個輸出映射,類型通過dstmap1type定義,尺寸與原圖像一緻;
- 第四個參數,OutputArray dstmap2,第二個輸出映射;
- 第五個參數,int dstmap1type,第一個輸出映射的類型應該為 CV_16SC2, CV_32FC1, or CV_32FC2;
- 第六個參數,bool nninterpolation = false,插值的選擇方式,預設選擇為最近鄰插值(INTER_NEAREST),否則将會使用更加複雜的插值方式!
二、getAffineTransform()函數
1、函數原型
Mat getAffineTransform( const Point2f src[], const Point2f dst[] );Mat getAffineTransform( InputArray src, InputArray dst );
2、函數功能
用三對相對應的點計算圖像的仿射變換;該函數計算仿射變換的2x3矩陣。
具體公式如下:
仿射變換
其中:
仿射變換
3、參數詳解
- 第一個參數,const Point2f src[],原圖像三角形在坐标系中的頂點坐标;
- 第二個參數,const Point2f dst[],目标圖像三角形在坐标系中的頂點坐标;
- 傳回值,傳回一個2x3的仿射矩陣。
三、getPerspectiveTransform()函數
1、函數原型
Mat getPerspectiveTransform(const Point2f src[], const Point2f dst[], int solveMethod = DECOMP_LU);Mat getPerspectiveTransform(InputArray src, InputArray dst, int solveMethod = DECOMP_LU);
2、函數功能
用四對相對應的點計算圖像的透視變換;
函數計算透視變換的3x3矩陣;
具體公式如下:
透視變換
其中:
透視變換
3、參數詳解
- 第一個參數,const Point2f src[],原圖像四邊形在坐标系中的頂點坐标;
- 第二個參數,const Point2f dst[],目标圖像四邊形在坐标系中的頂點坐标;
- 第三個參數,int solveMethod = DECOMP_LU,矩陣分解的類型,預設為DECOMP_LU(用最佳的樞軸單元進行高斯分解)
- 傳回值,傳回3x3透視變換矩陣
關于第三個參數,矩陣分解的類型還有以下幾種分解方式:
矩陣分解的類型
四、getRectSubPix()函數
1、函數原型
void getRectSubPix(InputArray image, Size patchSize, Point2f center, OutputArray patch, int patchType = -1);
2、函數功能
從原圖像中提取提取一個感興趣的矩形區域圖像;
具體的公式如下:
getRectSubPix
其中使用雙線性内插檢索非整數坐标處的像素的值,多通道的圖像對每個通道進行單獨處理;圖像可以是單通道圖像,也可以是三通道圖像;矩形的中心必須在圖像内部,矩形的一部分可以在圖像外部;
3、參數詳解
- 第一個參數,InputArray image,原圖像,即輸入的圖像;
- 第二個參數,Size patchSize,感興趣區域的大小 ;
- 第三個參數,Point2f center,從原圖像中提取感興趣區域中心的浮點坐标位置,這個中心坐标必須在原圖像内部;
- 第四個參數,OutputArray patch,輸出感興趣區域的圖像,這個圖像的大小為第二個參數patchSize,并且與原圖像具有同樣的通道數;
- 第五個參數,int patchType = -1,感興趣區域圖像的深度,預設情況下與原圖具有同樣的深度。
五、getRotationMatrix2D()函數
1、函數原型
Mat getRotationMatrix2D(Point2f center, double angle, double scale);
2、函數功能
計算二維旋轉的仿射矩陣;
具體的公式如下:
仿射矩陣
其中,
仿射矩陣
3、參數詳解
- 第一個參數,Point2f center,圖像旋轉的中心點的坐标;
- 第二個參數,double angle,圖像旋轉的角度;
- 第三個參數,double scale,圖像縮放的比例因子;
- 傳回值,傳回旋轉之後的矩陣。
六、invertAffineTransform()函數
1、函數原型
void invertAffineTransform(InputArray M, OutputArray iM);
2、函數功能
逆仿射變換,計算由2×3矩陣M表示的逆仿射變換,
具體的公式如下:
逆仿射變換
輸出是一個2×3的矩陣,與M具有相同的類型。
3、參數詳解
- 第一個參數,InputArray M,原來的仿射變換;
- 第二個參數,OutputArray iM,逆仿射變換。
我是奕雙,現在已經畢業将近兩年了,從大學開始學程式設計,期間學習了C需要程式設計,C++需要程式設計,Win32程式設計,MFC程式設計,畢業之後進入一家圖像處理相關領域的公司,掌握了用OpenCV對圖像進行處理,如果大家對相關領域感興趣的話,可以關注我,我這邊會為大家進行解答哦!如果大家需要相關學習資料的話,可以私聊我哦!