在上篇的博文中,我们重点讨论了基于霍夫变换的线段和圆检测。其实在图像的变换中,还有一部分是几何操作,这些操作包括各种方式的拉伸,包括一致性缩放和非一致性缩放(即扭曲)。对于平面区域,有两种方式的几何转换:一种是基于2×3矩阵进行的变换,叫仿射变换;另一种是基于3×3矩阵进行的变换,叫透视变换或者单应性映射。关于仿射变换和透射变换的矩阵变换,这篇博文不做重点讨论,因为图像本质就是矩阵,对矩阵的变换就是对图像像素的操作,很简单的数学知识。
仿射变换可以形象的表示成以下形式。一个平面内的任意平行四边形ABCD可以被仿射变换映射为另一个平行四边形A’B’C’D’。通俗的解释就是,可以将仿射变换想象成一幅图像画到一个胶版上,在胶版的角上推或拉,使其变形而得到不同类型的平行四边形。相比较仿射变换,透射变换更具有灵活性,一个透射变换可以将矩形转变成梯形。如下图:
下面关于OpenCV中进行仿射变换和透射变换的函数进行介绍下:
//仿射变换函数
void cvWarpAffine(
const CvArr* src,//输入图像
CvArr* dst,//输出图像
const CvMat* map_matrix,//2×3变换矩阵->传个矩阵进来?
int flags=CV_INTER_LINEAR|CV_WARP_FILL_OUTLIERS,//插值方法
CvScalar fillval=cvScalarAll(0)
)
从上面的函数中,我们可以看到其中需要传进去一个2×3变换矩阵,因此我们在调用cvWarpAffine()函数之前,要计算仿射映射矩阵,因此在OpenCV中有函数cvGetAffineTransform()来计算仿射映射矩阵。
CvMat* cvGetAffineTransform(
const CvPoint2D32f* pts_src,
const CvPoint2D32f* pts_dst,//src,dst三个二维点(x,y)的数组
CvMat* map_matrix//得到的仿射映射矩阵参数
)
下面给出这个仿射变换的完整程序示例:
#include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;
int main()
{