仿射变换(Affine Transformation或 Affine Map),又称仿射映射,是指在几何中,一个向量空间进行一次线性变换并接上一个平移,变换为另一个向量空间的过程。它保持了二维图形的“平直性”(即:直线经过变换之后依然是直线)和“平行性”(即:二维图形之间的相对位置关系保持不变,平行线依然是平行线,且直线上点的位置顺序不变)。
一个任意的仿射变换都能表示为乘以一个矩阵(线性变换)接着再加上一个向量(平移)的形式。
三种常见的变换形式:
- 旋转,rotation (线性变换)
- 平移,translation(向量加)
- 缩放,scale(线性变换)
仿射变换针对的是平面上的物体位姿变化,如水平/垂直方向位移、旋转、缩小/放大,常见的应用有ORC字符识别。投影变换针对的是三维空间中的位置变化,受限于物体依然是平面的,也称为二维投影变换,常见的应用有车牌识别。
使用OpenCV函数warpAffine 来实现一些简单的重映射。
使用OpenCV函数getRotationMatrix2D 来获得旋转矩阵。
warpAffine函数
void warpAffine(InputArray src,//输入图像,即源图像,填Mat类的对象即可
OutputArray dst, //函数调用后的运算结果存在这里,需和源图片有一样的尺寸和类型
InputArray M, //2×3的变换矩阵
Size dsize, //表示输出图像的尺寸
int flags=INTER_LINEAR,//插值方法的标识符。此参数有默认值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矩阵得到反变换
intborderMode=BORDER_CONSTANT, //边界像素模式,默认值为BORDER_CONSTANT。
const Scalar& borderValue=Scalar())