任意角度旋转函数如下:
void ImgRotate(const Mat &srcImg, Mat &rotatedImg, double degree)
{
int h = srcImg.rows;
int w = srcImg.cols;
//求对角线的长度,做一个以对角线为边长的正方形图像
int diaLength = int(sqrt((h*h + w*w)));
Mat tempImg = Mat::zeros(diaLength, diaLength, srcImg.type());
int tx = diaLength / 2 - w / 2;//原图左上角在新图上的x坐标
int ty = diaLength / 2 - h / 2;//原图左上角在新图上的y坐标
srcImg.copyTo(tempImg(Range(ty, ty + h), Range(tx, tx + w)));//把原图先复制到新的临时图上。
//以新的临时图的中心点为旋转点
Point rotatepoint;
rotatepoint.x = rotatepoint.y = diaLength / 2;
Mat rotaMat = getRotationMatrix2D(rotatepoint, degree, 1); // 获取二维旋转的仿射变换矩阵
warpAffine(tempImg, rotatedImg, rotaMat, Size(diaLength, diaLength));//进行仿射变换。
return ;
}
测试代码如下
Mat roatedt;
Mat t = imread("d:\\test.png", 1/*IMREAD_GRAYSCALE*/); //读取灰度图像
ImgRotate(t, roatedt, 45); //callthe rotate function
namedWindow("source", 0);
imshow("source", t);
namedWindow("rotated", 0);
imshow("rotated", roatedt);
当然这个函数还有一个问题,就是图像黑边比较多,特别是当图像旋转0,90,180等角度时,就将形成黑带了。