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
双线性插值。
其他的插值方法和其对应的参数:
具体的图像插值算法:点击打开
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));