仿射变换(缩放、平移、旋转、倾斜、反射)【Opencv】
1、缩放:就是通过放大或缩小来改变一幅图像的尺寸。在OpenCv中,用来缩放图像的函数是void resize(InputArray src,OutputArray dst,Size dsize,double fx=0,double fy=0,int interpolation=INTER_LINEAR)。
2、平移:就是只沿着一个特定的方向和距离移动一幅图像。在OpenCv中,可以使用函数是void warpAffine(InputArray src,OutputArray dst,InputArray M,Size dsize,int flags=INTER_LINEAR,int borderMode=BORDER_CONSTANT,const Scalar& borderValue=Scalar())进行平移。参数M是将src转换为dst的变换矩阵。
3、图像旋转:与平移类似,旋转通过函数warpAffine实现,但是旋转使用了函数Mat getRotationMatrix2D(Point2f center,double angle,double scale)来创建旋转变换矩阵。在这里,函数warpAffine的参数M是将src转换为dst的旋转变换矩阵。
4、倾斜变换在一个固定方向上代替与该方向平行的一条直线的符号距离成比例的每个像素。与之前的变换类似,应用于倾斜的函数是warpAffine。
5、反射也是一样函数warpAffine。
注:其他仿射变换也可使用函数warpAffine来实现,只是需要用到各自对应的变换矩阵。
示例代码如下:
#include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> using namespace cv; int main(int argc, char *argv[]) { Mat src; src = imread("D:/OpenCv/4.jpg"); namedWindow(" ORIGINAL ",WINDOW_AUTOSIZE); imshow(" ORIGINAL ",src); Mat dst,dst1,dst2; //缩放 resize(src,dst1,Size(0,0),0.5,0.5); namedWindow(" RESIZE ",WINDOW_AUTOSIZE); imshow(" RESIZE ",dst1); //平移 Mat M=(Mat_<double>(2,3)<<1,0,200,0,1,150); warpAffine(src,dst,M,src.size()); namedWindow(" TRANSLATED ",WINDOW_AUTOSIZE); imshow(" TRANSLATED ",dst); //旋转 Mat A=getRotationMatrix2D(Point2f(src.cols/2,src.rows/2),45,1); warpAffine(src,dst1,A,src.size()); namedWindow(" ROTATED ",WINDOW_AUTOSIZE); imshow(" ROTATED ",dst1); //倾斜 double m = 1/tan(M_PI/3); Mat Q=(Mat_<double>(2,3)<<1,m,0,0,1,0); warpAffine(src,dst1,Q,Size(src.cols+0.5*src.cols,src.rows)); namedWindow(" SKEWED ",WINDOW_AUTOSIZE); imshow(" SKEWED ",dst1); //反射 Mat dsth,dstv; Mat Mh=(Mat_<double>(2,3)<<-1,0,src.cols,0,1,0); Mat Mv=(Mat_<double>(2,3)<<1,0,0,0,-1,src.rows); Mat R =(Mat_<double>(2,3)<<-1,0,src.cols,0,-1,src.rows); warpAffine(src,dsth,Mh,src.size()); warpAffine(src,dstv,Mv,src.size()); warpAffine(src,dst2,R,src.size()); namedWindow(" H-REFLECTION ",WINDOW_AUTOSIZE); imshow(" H-REFLECTION ",dsth); namedWindow(" V-REFLECTION ",WINDOW_AUTOSIZE); imshow(" V-REFLECTION ",dstv); namedWindow(" REFLECTION ",WINDOW_AUTOSIZE); imshow(" REFLECTION ",dst2); waitKey(); return ; }代码输出结果如下: