1.目的
(1)使用OpenCV函數 warpAffine 來實現一些簡單的重映射.
(2)使用OpenCV函數 getRotationMatrix2D 來獲得一個 2×3 旋轉矩陣
(3)使用OpenCV函數getAffineTransform獲取仿射變換矩陣
2.原理
[1]仿射變換
使用仿射變換可以實現: 旋轉 (線性變換) ,平移 (向量加) ,縮放操作 (線性變換) 。通常使用 2×3 矩陣來表示仿射變換.
考慮到我們要使用矩陣 A 和 B 對二維向量 X 做變換, 所以也能表示爲下列形式:
我們能通過兩組三點求出仿射變換 (你能選擇自己喜歡的點), 接下來我們就能把仿射變換應用到圖像中所有的點。
3.部分代碼解釋
(1)getAffineTransform
/*
getAffineTransform參數解釋
srcTri:三個不共線的點
dstTri:變換後的三個點
warp_mat:2×3的仿射變換矩陣
*/
warp_mat = getAffineTransform(srcTri, dstTri);
(2)getRotationMatrix2D
/*
getRotationMatrix2D參數解釋
center:旋轉中心
angle:旋轉角度50 degrees,負數爲順時針,正數爲逆時針
*/
warp_rotation_mat = getRotationMatrix2D(center, angle, scale);
(3)warpAffine
/*
warpAffine參數解釋
src:輸入圖像
warp_dst:變換後圖像
warp_mat:仿射變換矩陣
src.size():輸出圖像大小
*/
warpAffine(src, warp_dst, warp_mat, src.size());
4.完整代碼
(1)CommonInclude.h
#ifndef COMMON_INCLUDE
#define COMMON_INCLUDE
#include<iostream>
using namespace std;
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace cv;
#endif
(2)Affine.cpp
#include "CommonInclude.h"
int main(int argc, char** argv){
if(argc<2){
cout << "more parameters are required!!!" << endl;
return(-1);
}
//創建圖像矩陣
Mat src;
Mat warp_dst;
Mat warp_rotation_dst;
Mat warp_mat, warp_rotation_mat;
//窗口名稱
char origin_win[] = "Origin";
char warpAffine_win[] = "Affine";
char warpAffineRotation_win[] = "Affine Rotation";
//圖像讀取
src = imread(argv[1]);
if(!src.data){
cout << "error to read image!!!" << endl;
return(-1);
}
imshow(origin_win, src);
Point2f srcTri[3];
Point2f dstTri[3];
srcTri[0] = Point2f( 0,0 );
srcTri[1] = Point2f( src.cols - 1, 0 );
srcTri[2] = Point2f( 0, src.rows - 1 );
dstTri[0] = Point2f( src.cols*0.0, src.rows*0.33 );
dstTri[1] = Point2f( src.cols*0.85, src.rows*0.25 );
dstTri[2] = Point2f( src.cols*0.15, src.rows*0.7 );
//獲取仿射變換矩陣
/*
getAffineTransform參數解釋
srcTri:三個不共線的點
dstTri:變換後的三個點
warp_mat:2×3的仿射變換矩陣
*/
warp_mat = getAffineTransform(srcTri, dstTri);
cout << warp_mat << endl;
//仿射變換
/*
warpAffine參數解釋
src:輸入圖像
warp_dst:變換後圖像
warp_mat:仿射變換矩陣
src.size():輸出圖像大小
*/
warpAffine(src, warp_dst, warp_mat, src.size());
imshow(warpAffine_win, warp_dst);
//仿射旋轉變換
Point2f center = Point2f(src.cols/2.0, src.rows/2.0);
double angle = 45;
double scale = 0.6;
//獲取旋轉矩陣
/*
getRotationMatrix2D參數解釋
center:旋轉中心
angle:旋轉角度50 degrees,負數爲順時針,正數爲逆時針
*/
warp_rotation_mat = getRotationMatrix2D(center, angle, scale);
warpAffine(src, warp_rotation_dst, warp_rotation_mat, src.size());
imshow(warpAffineRotation_win, warp_rotation_dst);
waitKey(0);
return(0);
}