opencv 利用仿射变换函数对图像进行任意角度旋转

来源:互联网 发布:淘宝有什么好看的衣服 编辑:程序博客网 时间:2024/06/10 02:07

任意角度旋转函数如下:

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等角度时,就将形成黑带了。

原创粉丝点击