Java OpenCv 仿射变换

67 阅读1分钟

a) 概念: 图点1,2,3与图点1,2、3对应,利用这2组对应点求出两者的变换矩阵,然后把它应用到整幅图像; b) 3点构成一个面; 仿射变换的变换矩阵大小为 2*3: c) 主要函数

  • Imgproc.getAffinelransform(MatOfPoint2f src, MatOfPoint2f dst); //23 的变换妇
  • ImgprocwarpAfine(Mat src,Mat dst, Mat M, Size dsizc); //用变换阵变换图像 -示例图

image.png

变换图

image.png

import org.opencv.core.*;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class WrapofflineChangePoint {

    static {
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    }


    public static void main(String[] args) {

        // 读取图像-->旋转
        Mat imread = Imgcodecs.imread(
                "D:\Users\WorkWaiting\HelloOpenCv\res" +
                        "\factory_ic_mould_assembling.png");

        HighGui.imshow("factory_ic_mould_assembling",imread);
        HighGui.waitKey(0);

        //定义两个变换的矩阵点
        Point[] points1 = new Point[3];
        points1[0] = new Point(0,0);
        points1[1] = new Point(140,0);
        points1[2] = new Point(0,140);

        Point[] points2 = new Point[3];
        points2[0] = new Point(0,0);
        points2[1] = new Point(140,0);
        points2[2] = new Point(75,140);

        // 变换点->面
        MatOfPoint2f matOfPoint2f1 = new MatOfPoint2f(points1);
        MatOfPoint2f matOfPoint2f2 = new MatOfPoint2f(points2);

        // 变换三角形图像
        Mat dst = new Mat();
        Mat affineTransform = Imgproc.getAffineTransform(matOfPoint2f1, matOfPoint2f2);
        Imgproc.warpAffine(imread, dst, affineTransform, imread.size());

        //显示图像 按键盘Enter键进行切换旋转图像
        HighGui.imshow("factory_ic_mould_assembling", dst);


        //退出图像显示程序0
        HighGui.waitKey(0);

        System.out.println("OK-->END Windows");
    }
}