Open CV 图像处理基础:(六)在Java中使用 Open CV进行图片翻转和图片旋转

在Java中使用 Open CV进行图片翻转和图片旋转

目录

前言

在Java中使用OpenCV进行图片翻转和旋转是一种基本的图像处理技术,广泛应用于计算机视觉、图像编辑和人工智能领域。OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库,它提供了许多常见的图像处理和分析功能,旨在为实时的图像处理提供高效能的解决方案。

图片翻转

函数

Core.flip 函数可以对图像进行沿x轴、y轴或两者都翻转的操作

java 复制代码
Core.flip(Mat src, Mat dst, int flipCode)

参数说明:

  • Mat src: 原始图像(输入图像)。
  • Mat dst: 翻转后的图像将存储在这里(输出图像)。它需要提前初始化。
  • int flipCode: 控制翻转方向的值。
    • flipCode = 0:沿x轴翻转(垂直翻转)。
    • flipCode > 0:沿y轴翻转(水平翻转)。
    • flipCode < 0:沿两轴翻转(即先水平后垂直翻转,或者先垂直后水平翻转)

代码

此段代码先读取图像,然后创建一个空图像,然后对图像进行垂直翻转,将结果保存新创建的空图像,最后保存翻转后的这个图像到文件中

java 复制代码
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Point;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class ImageFlip {
    static {
        // 加载 OpenCV 的本地库
        System.load("D:/dll/x64/opencv_java440.dll");
    }

    public static void main(String[] args) {
        String old = "D:/to/A.jpg";
        String outPut = "D:/to/A_0.jpg";
        // 读取图像
        Mat src = Imgcodecs.imread(old); // 替换为你的图像路径
        // 如果图像未找到或无法读取,则src.empty()会返回true
        if (src.empty()) {
            System.out.println("Error: Image cannot be loaded!");
            return;
        }
        // 创建一个空的图像用于存放翻转后的结果
        Mat dst = new Mat();
        // 对图像进行垂直翻转
        Core.flip(src, dst, 0);
        // 保存翻转后的图像
        Imgcodecs.imwrite(outPut, dst); // 替换为你的输出图像路径
    }
}

示例

  • 可以看到图片沿水平方向进行了翻转

其它翻转方向

垂直翻转

沿x轴翻转,即图像进行水平翻转,将flipCode设置为0

java 复制代码
        // 对图像进行水平翻转,将flipCode设置为0
        Core.flip(src, dst, 0);
两轴翻转

即先水平后垂直翻转,或者先垂直后水平翻转

对图像进行水平翻转,将flipCode设置为-1

java 复制代码
        Core.flip(src, dst, -1);

图片旋转

函数

Imgproc.getRotationMatrix2D 是OpenCV库中用于创建二维旋转矩阵的函数。在图像处理中,旋转是一种基本的仿射变换,它可以使图像围绕某一个点进行旋转。
Imgproc.getRotationMatrix2D 函数可以帮助你生成一个旋转矩阵,然后你可以使用Imgproc.warpAffine函数应用这个矩阵到图像上,以实现旋转的效果。

该函数的原型是:

java 复制代码
Mat getRotationMatrix2D(Point center, double angle, double scale)

参数说明:

  • center: 旋转的中心点,通常是图像的中心,你可以指定任何点作为旋转的中心。
  • angle: 旋转角度,以度为单位。正值表示逆时针旋转,负值表示顺时针旋转。
  • scale: 图像缩放的比例因子。如果不希望在旋转时改变图像的尺寸,这个值应该设置为1.0。如果你想在旋转的同时缩小或放大图像,可以设置不同的值。

返回值:

函数返回一个2x3的浮点数矩阵(即OpenCV中的Mat对象)。这个矩阵就是所谓的仿射变换矩阵,你可以直接将它作为Imgproc.warpAffine函数的参数来应用旋转。
getRotationMatrix2D函数计算得到的矩阵可以实现旋转加上缩放的复合变换。

这个矩阵的形式通常如下所示:

α β (1-α)*center.x - β* center.y

-β α β\*center.x + (1-α)\*center.y

其中:

  • α = scale * cos(θ)
  • β = scale * sin(θ)
  • θ 是旋转角度,此处使用的是逆时针定义。

这个变换矩阵考虑了旋转和缩放两个因素,还考虑了旋转不会改变中心点坐标的事实。而warpAffine函数会使用这个矩阵来计算图像中每个新位置上的像素值。

简而言之,通过Imgproc.getRotationMatrix2D函数,你可以创建一个仿射变换矩阵,它定义了一个围绕某一点的旋转和缩放操作。这个矩阵之后可以被用于Imgproc.warpAffine函数,以实现图像的旋转和缩放。

代码

在Java中使用OpenCV进行图片旋转的步骤:

  • 加载OpenCV库:在你的Java代码中,使用System.loadLibrary(Core.NATIVE_LIBRARY_NAME);来加载OpenCV库。
  • 读取图片:使用Imgcodecs.imread方法来读取图片。
  • 创建旋转矩阵:使用Imgproc.getRotationMatrix2D来创建旋转矩阵。这需要中心点坐标、旋转角度和缩放因子。
  • 应用旋转:应用旋转矩阵到读取的图片上,使用Imgproc.warpAffine方法。
  • 保存图片:使用Imgcodecs.imwrite来保存修改后的图片。

以下是一个旋转图片的具体代码示例:

java 复制代码
import org.opencv.core.Mat;
import org.opencv.core.Point;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class ImageRotate {
    static {
        // 加载 OpenCV 的本地库
        System.load("D:/dll/x64/opencv_java440.dll");
    }

    public static void main(String[] args) {
        String old = "D:/to/A.jpg";
        String outPut = "D:/to/A_Rotate.jpg";
        // 读取图像
        Mat src = Imgcodecs.imread(old); // 替换为你的图像路径
        // 如果图像未找到或无法读取,则src.empty()会返回true
        if (src.empty()) {
            System.out.println("Error: Image cannot be loaded!");
            return;
        }
        // 图片的中心点
        Point center = new Point(src.cols() / 2, src.rows() / 2);
        // 旋转矩阵
        Mat rotationMatrix = Imgproc.getRotationMatrix2D(center, 180, 1); // 90度旋转
        // 旋转后的图片大小
        Size rotatedSize = new Size(src.cols(), src.rows());
        // 应用旋转
        Mat dst = new Mat();
        Imgproc.warpAffine(src, dst, rotationMatrix, rotatedSize, Imgproc.INTER_LINEAR);
        // 保存旋转后的图片
        Imgcodecs.imwrite(outPut, dst);
    }
}

示例

可以看到旋转180度的图片和两轴翻转的图片方向一样

Open CV 专栏导航

相关推荐
金銀銅鐵几秒前
[Java] 如何自动生成简单的 PlantUML 类图
java·后端
ZWZhangYu1 分钟前
【Gradio系列】使用 Gradio 快速构建机器学习图像分类实战
人工智能·机器学习·分类
大字明1 分钟前
04 构建你的第一个 AI Agent
人工智能
溪饱鱼2 分钟前
如何节省OpenClaw 80%的Token消耗
人工智能·aigc·ai编程
羽翼安全3 分钟前
终端电脑视觉感知防拍屏软件 视觉感知防拍照软件
人工智能
霖大侠4 分钟前
Towards Generalizable Scene Change Detection
人工智能·深度学习·机器学习
Edward111111114 分钟前
3月23Math类,Arrays类
java·学习
小江的记录本5 分钟前
【Spring Boot】Spring Boot 全体系知识结构化拆解(附 Spring Boot 高频面试八股文精简版)
java·spring boot·后端·spring·面试·tomcat·mybatis
marteker8 分钟前
Meta 用人工智能取代内容审核人员,并扩大人工智能支持机器人使用范围
人工智能·机器人
2601_950760798 分钟前
UA-MHC H-2D(b)/EGSRNQDWL gp100四聚体-APC标记在抗原特异性T细胞检测中的应用
人工智能·深度学习·机器学习