Java+opencv3.2.0之仿射变换

仿射变换是指在几何中,一个向量空间进行一次线性变换并接上一个平移,变换为另一个向量空间的过程。
我们通常使用2x3的矩阵来表示仿射变换。
这里写图片描述
这里写图片描述
这里写图片描述

我们一般使用getRotationMatrix2D来获取旋转矩阵。
函数: Imgproc.getRotationMatrix2D(Point center, double angle, double scale)
参数说明:
center:源图像的旋转中心
angle:旋转角度
scale:缩放因子

仿射变换函数:
Imgproc.warpAffine(Mat src, Mat dst, Mat M, Size dsize, int flags, int borderMode, Scalar borderValue)
参数说明:
src:源图像
dst:目标图像
M:2x3旋转矩阵
dsize:输出图像的大小
flags:插值方式,默认INTER_LINEAR
borderMode:边界像素模式,默认BORDER_CONSTANT
borderValue:在恒定的边界情况下取的值,默认Scalar(),即0

示例代码
方法一:

public Mat rotate2(Mat splitImage, double angle)
    {

        Mat imgDst = splitImage.clone();

        Point pt = new Point(splitImage.cols() / 2, splitImage.rows() / 2);

        Mat affineTrans = Imgproc.getRotationMatrix2D(pt, angle, 1.0);

        Imgproc.warpAffine(splitImage, imgDst, affineTrans, imgDst.size(),
                Imgproc.INTER_CUBIC | Imgproc.WARP_FILL_OUTLIERS);

        return imgDst;
    }

方法二

public Mat rotate3(Mat splitImage, double angle)
    {
        double thera = angle * Math.PI / 180;
        double a = Math.sin(thera);
        double b = Math.cos(thera);

        int wsrc = splitImage.width();
        int hsrc = splitImage.height();

        int wdst = (int) (hsrc * Math.abs(a) + wsrc * Math.abs(b));
        int hdst = (int) (wsrc * Math.abs(a) + hsrc * Math.abs(b));
        Mat imgDst = new Mat(hdst, wdst, splitImage.type());

        Point pt = new Point(splitImage.cols() / 2, splitImage.rows() / 2);
        // 获取仿射变换矩阵
        Mat affineTrans = Imgproc.getRotationMatrix2D(pt, angle, 1.0);

        System.out.println(affineTrans.dump());
        // 改变变换矩阵第三列的值
        affineTrans.put(0, 2, affineTrans.get(0, 2)[0] + (wdst - wsrc) / 2);
        affineTrans.put(1, 2, affineTrans.get(1, 2)[0] + (hdst - hsrc) / 2);

        Imgproc.warpAffine(splitImage, imgDst, affineTrans, imgDst.size(),
                Imgproc.INTER_CUBIC | Imgproc.WARP_FILL_OUTLIERS);
        return imgDst;
    }

源图片:
这里写图片描述

方法一结果:
这里写图片描述

方法二结果:
这里写图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值