Java opencv 透视变换

184 阅读1分钟

透视变换

概念: 透视令换(Perspeclive Transfornation)将图片投影到一个新的视平面,也称作投影映射;
要找到4个点,其中任意三个不共线;透视变换焰阵 M 大小为 3*3;

主要函数:

  • Imgproc.getPerspectivelransform(Mat src, Mat dst);
  • Imgproc.warpPerspective(Mat src, Mat dst, Mat M, Size dsizc, int flags);

原图:

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 WrapofflinePrespectivePoint {

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


    public static void main(String[] args) {

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

        HighGui.imshow("page",imread); //1280 X 720
        HighGui.waitKey(0);

        //定义两个变换的矩阵点
        Point[] points1 = new Point[4]; //输入图像点
        points1[0] = new Point(200,120);
        points1[1] = new Point(400,240);
        points1[2] = new Point(180,480);
        points1[3] = new Point(460,460);

        Point[] points2 = new Point[4]; //输出图像点
        points2[0] = new Point(0,0);
        points2[1] = new Point(240,0);
        points2[2] = new Point(0,240);
        points2[3] = new Point(240,240);

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

        // 变换三角形图像
        Mat dst = new Mat();
        Mat affineTransform = Imgproc.getPerspectiveTransform(matOfPoint2f1, matOfPoint2f2);
        Imgproc.warpPerspective(imread, dst, affineTransform, new Size(240,240));

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


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

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