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);
}