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

OpenCVSharp是一个基于OpenCV的C#封装库,可以用来实现各种图像处理任务,包括仿射变换仿射变换是一种二维坐标的变换方式,可以通过平移、旋转、缩放等操作来改变图像的形状和位置。下面是一个使用OpenCVSharp实现仿射变换的示例代码: ```csharp using OpenCvSharp; using System; namespace AffineTransformation { class Program { static void Main(string[] args) { // 读取图像 Mat src = Cv2.ImRead("lena.jpg"); // 定义变换矩阵 Mat affine = new Mat(2, 3, MatType.CV_32FC1); affine.Set<double>(0, 0, Math.Cos(Math.PI / 4)); affine.Set<double>(0, 1, -Math.Sin(Math.PI / 4)); affine.Set<double>(0, 2, src.Width / 2); affine.Set<double>(1, 0, Math.Sin(Math.PI / 4)); affine.Set<double>(1, 1, Math.Cos(Math.PI / 4)); affine.Set<double>(1, 2, src.Height / 2); // 进行仿射变换 Mat dst = new Mat(); Cv2.WarpAffine(src, dst, affine, src.Size(), InterpolationFlags.Linear, BorderTypes.Constant); // 显示结果图像 Cv2.ImShow("Original", src); Cv2.ImShow("Affine Transformation", dst); Cv2.WaitKey(0); } } } ``` 上述代码中,首先使用`Cv2.ImRead()`函数读取图像,然后定义一个2x3的矩阵`affine`,用来表示仿射变换的变换矩阵。在本例中,我们将图像图像中心逆时针旋转45度,并平移到图像中心。然后使用`Cv2.WarpAffine()`函数进行仿射变换,将图像进行变换得到目标图像。最后,使用`Cv2.ImShow()`函数显示图像和变换后的图像,并使用`Cv2.WaitKey()`函数等待用户按下任意键关闭窗口。 需要注意的是,在进行仿射变换时,需要通过变换矩阵来指定变换操作。可以使用`Cv2.GetAffineTransform()`函数或者`Cv2.GetAffineTransform()`函数来计算仿射变换的变换矩阵。在本例中,我们手动定义了一个变换矩阵,以实现图像的逆时针旋转和平移操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值