void Roade(Mat &src, double angle)//angle 角度值,当其为正值时进行逆时针旋转;当其为负值时,顺时针旋转
{
Mat dst;//输出图像
int length;//输出图像的宽度或高度
//为了保证无论如何旋转都能放下,输出图像的长和宽都设为输入图像对角线长度乘以SCALE
//但如果是缩小(SCALE<=1),这样会导致临时图像中放不下原图,所以对于所有缩小的情况,输出图像和临时图像的长宽都设为原图的对角线长度
if (0.5 <= 1)
length = sqrt(src.cols*src.cols + src.rows*src.rows);
else
length = sqrt(src.cols*src.cols + src.rows*src.rows) * 0.5;
//建立临时图像,长宽都是源图像的对角线长度,将源图像复制到临时图像的中心后再变换
Mat tempImg(length, length, src.type());//临时图像,大小和输出图像一样大
int ROI_x = length / 2 - src.cols / 2;//ROI矩形左上角的x坐标
int ROI_y = length / 2 - src.rows / 2;//ROI矩形左上角的y坐标
Rect ROIRect(ROI_x, ROI_y, src.cols, src.rows);//ROI矩形
Mat tempImgROI2(tempImg, ROIRect);//tempImg的中间部分
src.copyTo(tempImgROI2);//将原图复制到tempImg的中心
Point2f center(length / 2, length / 2);//旋转中心
Mat M = getRotationMatrix2D(center, angle, 0.5);//计算旋转的仿射变换矩阵
warpAffine(tempImg, dst, M, Size(length, length));//仿射变换
//显示
imwrite("src.jpg", src);
imwrite("tempImg.jpg", tempImg);
imwrite("dst.jpg", dst);//最终旋转得到的图像
}
注意:这里的 角度 是角度值并非是弧度值。