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

相关推荐
szxinmai主板定制专家1 分钟前
【国产NI替代】基于FPGA的32通道(24bits)高精度终端采集核心板卡
大数据·人工智能·fpga开发
海棠AI实验室4 分钟前
AI的进阶之路:从机器学习到深度学习的演变(三)
人工智能·深度学习·机器学习
机器懒得学习15 分钟前
基于YOLOv5的智能水域监测系统:从目标检测到自动报告生成
人工智能·yolo·目标检测
ProtonBase23 分钟前
如何从 0 到 1 ,打造全新一代分布式数据架构
java·网络·数据库·数据仓库·分布式·云原生·架构
乐之者v30 分钟前
leetCode43.字符串相乘
java·数据结构·算法
QQ同步助手30 分钟前
如何正确使用人工智能:开启智慧学习与创新之旅
人工智能·学习·百度
AIGC大时代33 分钟前
如何使用ChatGPT辅助文献综述,以及如何进行优化?一篇说清楚
人工智能·深度学习·chatgpt·prompt·aigc
流浪的小新37 分钟前
【AI】人工智能、LLM学习资源汇总
人工智能·学习
martian6652 小时前
【人工智能数学基础篇】——深入详解多变量微积分:在机器学习模型中优化损失函数时应用
人工智能·机器学习·微积分·数学基础
人机与认知实验室2 小时前
人、机、环境中各有其神经网络系统
人工智能·深度学习·神经网络·机器学习