旋转、仿射变换和SURF特征点检测
一、弯曲变换函数warpAffine ()
1.1 warpAffine ()各参数详解
voidwarpAffine(InputArray src,OutputArray dst,InputArray M,Size dsize, int flags =INTER_LINEAR, intborderMode =BORDER_CONSTANT,constScalar& 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。
另外提一点,我们的WarpAffine函数与一个叫做cvGetQuadrangleSubPix( )的函数类似,但是不完全相同。WarpAffine要求输入和输出图像具有同样的数据类型,有更大的资源开销(因此对小图像不太合适)而且输出图像的部分可以保留不变。而cvGetQuadrangleSubPix 可以精确地从8位图像中提取四边形到浮点数缓存区中,具有比较小的系统开销,而且总是全部改变输出图像的内容。
1.2调用示例
二、旋转变换函数
2.1 getRotationMatrix2D()各参数详解
MatgetRotationMatrix2D(Point2fcenter,double angle,double scale)
Ø 第一个参数,Point2f类型的center,表示源图像的旋转中心。
Ø 第二个参数,double类型的angle,旋转角度。角度为正值表示向逆时针旋转(坐标原点是左上角)。
Ø 第三个参数,double类型的scale,缩放系数。
此函数计算以下矩阵:
其中:
2.2调用示例
三、 SURF特征点检测
在OpenCV中,使用SURF进行特征点描述主要是drawMatches方法和BruteForceMatcher类的运用。
3.1 drawMatches()函数各参数详解
drawMatches()函数用于绘制出相匹配的两个图像的关键点
voiddrawMatches(constMat& img1, constvector<KeyPoint>&keypoints1,constMat& img2, constvector<KeyPoint>&keypoints2, constvector<DMatch>& matches1to2,Mat&outImg,constScalar&matchColor =Scalar::all(-1),constScalar&singlePointColor =Scalar::all(-1),constvector<char>&matchesMask =vector<char>(),intflags = DrawMatchesFlags::DEFAULT)
voiddrawMatches(constMat& img1, constvector<KeyPoint>&keypoints1,constMat& img2, constvector<KeyPoint>&keypoints2,constvector<vector<DMatch>>&matches1to2,Mat&outImg,constScalar&matchColor =Scalar::all(-1),constScalar&singlePointColor =Scalar::all(-1),constvector<vector<char>>& matchesMask =vector<vector<char>>(), intflags = DrawMatchesFlags::DEFAULT)
除了第五个参数matches1to2和第九个参数matchesMask有细微的差别以外,两个版本的基本上相同。
Ø 第一个参数,const Mat&类型的img1,第一幅源图像。
Ø 第二个参数,const vector<KeyPoint>&类型的keypoints1,根据第一幅源图像得到的特征点,它是一个输出参数。
Ø 第三个参数,const Mat&类型的img2,第二幅源图像。
Ø 第四个参数,const vector<KeyPoint>&类型的keypoints2,根据第二幅源图像得到的特征点,它是一个输出参数。
Ø 第五个参数,matches1to2,第一幅图像到第二幅图像的匹配点,即表示每一个图1中的特征点都在图2中有一一对应的点、
Ø 第六个参数,Mat&类型的outImg,输出图像,其内容取决于第五个参数标识符falgs。
Ø 第七个参数,const Scalar&类型的matchColor,匹配的输出颜色,即线和关键点的颜色。它有默认值Scalar::all(-1),表示颜色是随机生成的。
Ø 第八个参数,c