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 专栏导航

相关推荐
世间万物皆对象11 分钟前
Spring Boot核心概念:日志管理
java·spring boot·单元测试
Guofu_Liao18 分钟前
大语言模型---LoRA简介;LoRA的优势;LoRA训练步骤;总结
人工智能·语言模型·自然语言处理·矩阵·llama
没书读了40 分钟前
ssm框架-spring-spring声明式事务
java·数据库·spring
小二·1 小时前
java基础面试题笔记(基础篇)
java·笔记·python
开心工作室_kaic1 小时前
ssm161基于web的资源共享平台的共享与开发+jsp(论文+源码)_kaic
java·开发语言·前端
懒洋洋大魔王1 小时前
RocketMQ的使⽤
java·rocketmq·java-rocketmq
武子康1 小时前
Java-06 深入浅出 MyBatis - 一对一模型 SqlMapConfig 与 Mapper 详细讲解测试
java·开发语言·数据仓库·sql·mybatis·springboot·springcloud
转世成为计算机大神2 小时前
易考八股文之Java中的设计模式?
java·开发语言·设计模式
qq_327342732 小时前
Java实现离线身份证号码OCR识别
java·开发语言
阿龟在奔跑3 小时前
引用类型的局部变量线程安全问题分析——以多线程对方法局部变量List类型对象实例的add、remove操作为例
java·jvm·安全·list