圖像旋轉是指把定義的圖像繞某一點以逆時針或順時針方向旋轉必定的角度,一般是指繞圖像的中心以逆時針方向旋轉。
首先咱們來計算任一一點(x,y)繞其中點(xcenter,ycenter)通過角度sigma逆時針旋轉後新座標(x1,y1),咱們假設圖像的左上角爲(left, top),右下角爲(right, bottom),圖像的寬爲width,高爲height,可得下列公式(具體推導見下面部分):
xcenter = (width+1)/2+left;
ycenter = (height+1)/2+top;
x1 = (x - xcenter) cosθ - (y - ycenter) sinθ + xcenter;
y1 = (x - xcenter) sinθ + (y - ycenter) cosθ + ycenter;
/****************************************************************************************************************************************************************************/
/* 公式推導*/
/****************************************************************************************************************************************************************************/
如圖,咱們假設點(x,y)位於角a處,(x1,y1)是由(x,y)繞原點(xcenter,ycenter)逆時針旋轉θ
很容易獲得:
xcenter = (width+1)/2+left;
ycenter = (height+1)/2+top;
咱們知道點(x,y)和(x1,y1)都位於原點在(xcenter,ycenter),半徑爲r=dis(原點,(x,y))的圓上,則x,y咱們能夠表示成:
x = rcosa + xcenter;
y = rsina + ycenter;
x1 ,y1咱們能夠表示爲:
x1 = rcos(a + θ )+ xcenter;
y1 = rsin( a + θ )+ ycenter;
x1 = rcosa*cosθ - rsina*cosθ + xcenter;
y1 = rsina*cosθ + rcosa*sinθ + ycenter;
將 x - xcenter = rcosa; y - ycenter = rsina帶入上式得
x1 = (x - xcenter) cosθ - (y - ycenter) sinθ + xcenter;
y1 = (x - xcenter) sinθ + (y - ycenter) cosθ + ycenter;
得證
/*****************************************************************************************************************************************************************************/
知道上面的公式後,咱們旋轉圖像就很簡單了,直接利用opencv中的函數GetQuadrangleSubPix(提取象素四邊形,使用子象素精度) 便可很快的獲得旋轉圖像html
/*******************************************************************/函數
GetQuadrangleSubPix
spa
/*******************************************************************/
提取象素四邊形,使用子象素精度.net
void cvGetQuadrangleSubPix( const CvArr* src, CvArr* dst, const CvMat* map_matrix );
-
src
-
輸入圖像.
-
dst
-
提取的四邊形.
-
map_matrix
-
3 × 2 變換矩陣 [A|b] (見討論).
函數 cvGetQuadrangleSubPix 以子象素精度從圖像 src 中提取四邊形,使用子象素精度,而且將結果存儲於 dst ,計算公式是:orm
dst(x + width(dst) / 2,y + height(dst) / 2) = src(A11x + A12y + b1,A21x + A22y + b2)htm
其中 A和 b 均來自映射矩陣(譯者注:A, b爲幾何形變參數) ,映射矩陣爲:ci
/***************************************************************************************************************/
咱們全部求的就是上述map_matrix矩陣中的各元素,旋轉到這裏就差很少了,接下來是縮放了get
/***************************************************************************************************************/opencv
圖像的縮放:縮放咱們將圖像的任一點(x,y)同時乘以一個係數k便可,若是咱們想在圖像旋轉的過程當中同時進行圖像的縮放,那麼咱們能夠將係數因子k設置爲f(θ)即:θ的函數class