您的位置 首页 java

Java,OpenCV,图像旋转(Rotation),视角转换,图像透视变换

图像旋转(Rotation)

图形旋转是以图像的中心为原点,旋转一定的角度,也就是将图像上的所有像素都旋转一个相同的角度。旋转后图像的的大小一般会改变,即可以把转出显示区域的图像截去,或者扩大图像范围来显示所有的图像。图像的旋转变换也可以用矩阵变换来表示。

函数说明:Imgproc.getRotationMatrix2D(Point center, double angle, double scale)

参数详解: Point center:表示旋转的中心点; double angle:表示旋转的角度; double scale:图像缩放因子;

代码案例

 package com.what21.opencv01.demo05;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Point;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

/**
 * 图像旋转
 */
public class OpenCVRotate {

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

    public static void main(String[] args) {
        Mat src = Imgcodecs.imread("D:/1.jpg");
        Mat dst = src.clone();
        //复制矩阵进入dst
        Point center = new Point(src.width() / 2.0, src.height() / 2.0);
        Mat affineTrans = Imgproc.getRotationMatrix2D(center, 33.0, 1.0);
        Imgproc.warpAffine(src, dst, affineTrans, dst.size(), Imgproc.INTER_NEAREST);
        Imgcodecs.imwrite("D:/1$1.jpg", dst);
        affineTrans = Imgproc.getRotationMatrix2D(center, 110.0, 1.1);
        Imgproc.warpAffine(src, dst, affineTrans, dst.size(), Imgproc.INTER_NEAREST);
        Imgcodecs.imwrite("D:/1$2.jpg", dst);
    }

}  

1.jpg

1$1.jpg

1$2.jpg

透视变换(Perspective Transformation)

透视变换(Perspective Transformation)是指利用透视中心、像点、目标点三点共线的条件,按透视旋转定律使承影面(透视面)绕迹线(透视轴)旋转某一角度,破坏原有的投影光线束,仍能保持承影面上投影几何图形不变的变换。

代码案例

 package com.what21.opencv01.demo05;

import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.Point;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import org.opencv.utils.Converters;

import java.util.List;

/**
 * 透视变换
 */
public class OpenCVPerspective {

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

    public static void main(String[] args) {
        Mat src = Imgcodecs.imread("D:/1.jpg");
        //读取图像到矩阵中,取灰度图像
        if (src.empty()) {
            return;
        }
        try {
            int xMargin, yMargin;
            int x0 = src.cols() / 4;
            int x1 = (src.cols() / 4) * 3;
            int y0 = src.cols() / 4;
            int y1 = (src.cols() / 4) * 3;
            Mat dst = new Mat();

            List<Point> listSrcs = java.util.Arrays.asList(new Point(x0, y0), new Point(x0, y1), new Point(x1, y1), new Point(x1, y0));
            Mat srcPoints = Converters.vector_Point_to_Mat(listSrcs, CvType.CV_32F);

            xMargin = src.cols() / 10;
            yMargin = src.rows() / 10;
            List<Point> listDsts = java.util.Arrays.asList(new Point(x0 + xMargin, y0 + yMargin), listSrcs.get(1), listSrcs.get(2), new Point(x1 - xMargin, y0 + yMargin));
            Mat dstPoints = Converters.vector_Point_to_Mat(listDsts, CvType.CV_32F);

            Mat perspectiveMmat = Imgproc.getPerspectiveTransform(srcPoints, dstPoints);
            Imgproc.warpPerspective(src, dst, perspectiveMmat, src.size(), Imgproc.INTER_LINEAR);
            Imgcodecs.imwrite("D:/1.dst1.jpg", dst);

            xMargin = src.cols() / 8;
            yMargin = src.cols() / 8;
            listDsts.set(0, listSrcs.get(0));
            listDsts.set(1, listSrcs.get(1));
            listDsts.set(2, new Point(x1 - xMargin, y1 - yMargin));
            listDsts.set(3, new Point(x1 - xMargin, y0 - yMargin));
            dstPoints = Converters.vector_Point_to_Mat(listDsts, CvType.CV_32F);

            perspectiveMmat = Imgproc.getPerspectiveTransform(srcPoints, dstPoints);
            Imgproc.warpPerspective(src, dst, perspectiveMmat, src.size(), Imgproc.INTER_LINEAR);
            Imgcodecs.imwrite("D:/1.dst2.jpg", dst);

            xMargin = src.cols() / 6;
            yMargin = src.cols() / 6;
            listDsts.set(0, new Point(x0 + xMargin, y0 + yMargin));
            listDsts.set(1, listSrcs.get(1));
            listDsts.set(2, new Point(x1 - xMargin, y1 - yMargin));
            listDsts.set(3, listSrcs.get(3));
            dstPoints = Converters.vector_Point_to_Mat(listDsts, CvType.CV_32F);

            perspectiveMmat = Imgproc.getPerspectiveTransform(srcPoints, dstPoints);
            Imgproc.warpPerspective(src, dst, perspectiveMmat, src.size(), Imgproc.INTER_LINEAR);

            Imgcodecs.imwrite("D:/1.dst3.jpg", dst);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}  

1.dst1.jpg

1.dst2.jpg

1.dst3.jpg

文章来源:智云一二三科技

文章标题:Java,OpenCV,图像旋转(Rotation),视角转换,图像透视变换

文章地址:https://www.zhihuclub.com/184158.shtml

关于作者: 智云科技

热门文章

网站地图