OpenCV 几何变换-图像旋转

2022-05-07 09:27:55 浏览数 (1)

OpenCV提供了warpAffine函数实现图片仿射变换功能,我们可以利用这个函数实现图像旋转,函数原型为:

代码语言:javascript复制
CV_EXPORTS_W void warpAffine( 
InputArray src, 
OutputArray dst,
InputArray M, 
Size dsize,
int flags=INTER_LINEAR,
int borderMode=BORDER_CONSTANT,
const Scalar& borderValue=Scalar());

其中第一,二个参数是输入和输出的图像; 第三个参数仿射变换矩阵; 第四个参数为变换后的图像尺寸; 第五个参数为差值方法,参数的默认值为int flags=INTER_LINEAR双线性插值。 其他的插值方法和其对应的参数: 具体的图像插值算法:点击打开

代码语言:javascript复制
INTER_NEAREST=CV_INTER_NN, //!< 最邻近插值
INTER_LINEAR=CV_INTER_LINEAR, //!< 双线性插值
INTER_CUBIC=CV_INTER_CUBIC, //!<双三次插值
INTER_AREA=CV_INTER_AREA, //!< 基于面积插值
INTER_LANCZOS4=CV_INTER_LANCZOS4, //!< 8邻域兰索斯插值

第六个参数为边界处理方法,参数的默认值为int borderMode=BORDER_CONSTANT 第六个参数为边界颜色。

那么实现旋转操作的重点就在于输入合适的仿射变换矩阵-M。 OpenCV提供了getRotationMatrix2D函数计算旋转加缩放的仿射矩阵,其函数原型为:

代码语言:javascript复制
CV_EXPORTS_W Mat getRotationMatrix2D( 
Point2f center, 
double angle, 
double scale );

参数很简单明了,不需要缩放时只需把第三个参数设为1。 角度为负,顺时针;角度为正,逆时针。 该函数的返回值是一个Mat类型的矩阵。

代码语言:javascript复制
SrcImage=imread("1.jpg");
Mat MoveImage(SrcImage.rows,SrcImage.cols,CV_8UC3,Scalar(0,0,0));
double angle = -9.9;//角度
Point2f center(SrcImage.cols/2,SrcImage.rows/2);//中心
Mat M = getRotationMatrix2D(center,angle,1);//计算旋转的仿射变换矩阵 
cout<<M<<endl;	
warpAffine(SrcImage,MoveImage,M,Size(SrcImage.cols,SrcImage.rows));//仿射变换  
circle(MoveImage,center,2,Scalar(255,0,0));

0 人点赞