仿射變換
仿射變換(Affine Transformation或 Affine Map),又稱仿射映射,是指在幾何中,一個向量空間進行一次線性變換並接上一個平移,變換爲另一個向量空間的過程。它保持了二維圖形的“平直性”(即:直線經過變換之後依然是直線)和“平行性”(即:二維圖形之間的相對位置關係保持不變,平行線依然是平行線,且直線上點的位置順序不變)。
一個任意的仿射變換都能表示爲乘以一個矩陣(線性變換)接着再加上一個向量(平移)的形式。
那麼, 我們能夠用仿射變換來表示如下三種常見的變換形式:
旋轉,rotation (線性變換)
平移,translation(向量加)
縮放,scale(線性變換)
仿射變換代表的是兩幅圖之間的一種映射關係,使用矩陣 A 和 B 對二維向量X=[x,y]T 做變換
通常使用2 x 3的矩陣來表示仿射變換,所以也能表示爲下列形式:
仿射變換應用場景:
1.已知 X和T,求矩陣 M
2.已知 M和X,求得T
對一張圖片旋轉、平移、縮放就屬於場景2
仿射變換相關的函數
OpenCV仿射變換相關的函數一般涉及到warpAffine和getRotationMatrix2D這兩個:
warpAffine 來實現一些簡單的重映射
getRotationMatrix2D 來獲得旋轉矩陣
warpAffine函數
warpAffine函數的作用是依據如下式子,對圖像做仿射變換
void warpAffine(
InputArray src,
OutputArray dst,
InputArray M,
Size dsize,
int flags=INTER_LINEAR,
int borderMode=BORDER_CONSTANT,
const Scalar& borderValue=Scalar())
InputArray類型的src,輸入圖像,即源圖像,填Mat類的對象即可。
OutputArray類型的dst,函數調用後的運算結果存在這裏,需和源圖片有一樣的尺寸和類型。
InputArray類型的M,2×3的變換矩陣。
Size類型的dsize,表示輸出圖像的尺寸。
int類型的flags,插值方法的標識符。此參數有默認值INTER_LINEAR(線性插值),可選的插值方式如下:
INTER_NEAREST - 最近鄰插值
INTER_LINEAR - 線性插值(默認值)
INTER_AREA - 區域插值
INTER_CUBIC –三次樣條插值
INTER_LANCZOS4 -Lanczos插值
CV_WARP_FILL_OUTLIERS - 填充所有輸出圖像的象素。如果部分象素落在輸入圖像的邊界外,那麼它們的值設定爲 fillval.
CV_WARP_INVERSE_MAP –表示M爲輸出圖像到輸入圖像的反變換,即 。因此可以直接用來做象素插值。否則, warpAffine函數從M矩陣得到反變換。
第六個參數,int類型的borderMode,邊界像素模式,默認值爲BORDER_CONSTANT。
第七個參數,const Scalar&類型的borderValue,在恆定的邊界情況下取的值,默認值爲Scalar(),即0。
旋轉
getRotationMatrix2D函數,可以由旋轉中心center、旋轉角度angle、縮放係數scale,計算出計算二維旋轉變換矩陣,即warpAffine函數的第三個參數,再使用warpAffine函數進行仿射變換
getRotationMatrix2D函數原型:
cv::Mat cv::getRotationMatrix2D( Point2f center,double angle, double scale )
{
angle *= CV_PI/180;
double alpha = cos(angle)*scale;
double beta = sin(angle)*scale;
Mat M(2, 3, CV_64F);
double* m = (double*)M.data;
m[0] = alpha;
m[1] = beta;
m[2] = (1-alpha)*center.x - beta*center.y;
m[3] = -beta;
m[4] = alpha;
m[5] = beta*center.x + (1-alpha)*center.y;
return M;
}
Point2f類型的center,表示源圖像的旋轉中心
double類型的angle,旋轉角度。角度爲正值表示向逆時針旋轉(座標原點是左上角)
double類型的scale,縮放係數