1. 程式人生 > 其它 >listen函式的第二個引數_【影象處理】OpenCV系列十七 --- 幾何影象變換函式詳解(一)...

listen函式的第二個引數_【影象處理】OpenCV系列十七 --- 幾何影象變換函式詳解(一)...

技術標籤:listen函式的第二個引數opencv 仿射變換影象處理 四個點構成矩形的條件未定義與 struct 型別的輸入引數相對應的函式 fetch未定義與 struct 型別的輸入引數相對應的函式 isnan。

上一篇我們學習了仿射變換的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矩陣。

具體公式如下:

b3b7e280cd4d5d7fb1df8c8dcfb56d48.png

仿射變換

其中:

3b377992548f2c7e259127727a8e46e4.png

仿射變換

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矩陣;

具體公式如下:

d05c54a69aa1032d6dfdd10fa5927c50.png

透視變換

其中:

a9ed321de77d5f15d524d78113668af9.png

透視變換

3、引數詳解

  • 第一個引數,const Point2f src[],原影象四邊形在座標系中的頂點座標;
  • 第二個引數,const Point2f dst[],目標影象四邊形在座標系中的頂點座標;
  • 第三個引數,int solveMethod = DECOMP_LU,矩陣分解的型別,預設為DECOMP_LU(用最佳的樞軸單元進行高斯分解)
  • 返回值,返回3x3透視變換矩陣

關於第三個引數,矩陣分解的型別還有以下幾種分解方式:

7cec4cdd84b7e0cbbc17b04b1849d521.png

矩陣分解的型別

四、getRectSubPix()函式

1、函式原型

void getRectSubPix(InputArray image,  Size patchSize, Point2f center,  OutputArray patch,  int patchType = -1);

2、函式功能

從原影象中提取提取一個感興趣的矩形區域影象;

具體的公式如下:

321e68ee2a616b913e83ac8c3ad35bdd.png

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、函式功能

計算二維旋轉的仿射矩陣;

具體的公式如下:

e74fe25f9e9955e091dc9da3f6f0de6e.png

仿射矩陣

其中,

697319f23b1ef94269c015254aa924ff.png

仿射矩陣

3、引數詳解

  • 第一個引數,Point2f center,影象旋轉的中心點的座標;
  • 第二個引數,double angle,影象旋轉的角度;
  • 第三個引數,double scale,影象縮放的比例因子;
  • 返回值,返回旋轉之後的矩陣。

六、invertAffineTransform()函式

1、函式原型

void invertAffineTransform(InputArray M,  OutputArray iM);

2、函式功能

逆仿射變換,計算由2×3矩陣M表示的逆仿射變換,

具體的公式如下:

ab85a514345c7fa022fff7593ab137d2.png

逆仿射變換

輸出是一個2×3的矩陣,與M具有相同的型別。

3、引數詳解

  • 第一個引數,InputArray M,原來的仿射變換;
  • 第二個引數,OutputArray iM,逆仿射變換。

我是奕雙,現在已經畢業將近兩年了,從大學開始學程式設計,期間學習了C需要程式設計,C++需要程式設計,Win32程式設計,MFC程式設計,畢業之後進入一家影象處理相關領域的公司,掌握了用OpenCV對影象進行處理,如果大家對相關領域感興趣的話,可以關注我,我這邊會為大家進行解答哦!如果大家需要相關學習資料的話,可以私聊我哦!