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

任意角度旋转函数如下:

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

你可能感兴趣的:(Opencv)