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

news2024/11/17 9:27:27

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

目录

  • 在Java中使用 Open CV进行图片翻转和图片旋转
    • 前言
    • 图片翻转
      • 函数
      • 代码
      • 示例
      • 其它翻转方向
        • 垂直翻转
        • 两轴翻转
    • 图片旋转
      • 函数
      • 代码
      • 示例
    • Open CV 专栏导航

前言

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

图片翻转

函数

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

Core.flip(Mat src, Mat dst, int flipCode)

参数说明:

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

代码

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

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

        // 对图像进行水平翻转,将flipCode设置为0
        Core.flip(src, dst, 0);

在这里插入图片描述

两轴翻转

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

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

        Core.flip(src, dst, -1);

在这里插入图片描述

图片旋转

函数

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

该函数的原型是:

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来保存修改后的图片。

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


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

  • (一)Open CV 在windows环境初始化和 Java 动态库加载方式介绍
  • (二)Open CV 从基本概念到实践操作
  • (三)使用 Open CV 在 Java 中进行基本的图片缩放操作
  • (四)使用 Open CV 在 Java 中进行基本的图片模糊处理
  • (五)Java 使用 Open CV 的绘图函数
  • (六)在Java中使用 Open CV进行图片翻转和图片旋转
  • (七)学习 OpenCV 的图像增强和边缘检测功能

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1385343.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习根据金标准标记数据-九五小庞

根据金标准标记数据是一种在机器学习和数据科学中常见的操作&#xff0c;主要用于评估分类模型的性能。其基本步骤如下&#xff1a; 收集数据&#xff1a;首先需要收集相关领域的原始数据&#xff0c;这些数据通常来自不同的来源和渠道。数据清洗和预处理&#xff1a;在这一步…

常见的限流算法

本文已收录至我的个人网站&#xff1a;程序员波特&#xff0c;主要记录Java相关技术系列教程&#xff0c;共享电子书、Java学习路线、视频教程、简历模板和面试题等学习资源&#xff0c;让想要学习的你&#xff0c;不再迷茫。 天下武学出同源 正所谓天下武学殊途同归&#xff…

怎么批量重命名图片?分享3个高效方法!

怎么批量重命名图片&#xff1f;在日常生活中&#xff0c;将图片批量重命名是一项非常实用的操作。有时候我们拍摄或收集了很多图片&#xff0c;需要对其进行整理和归类。通过批量重命名&#xff0c;我们可以快速为图片添加序号、日期或其他标识&#xff0c;使其更有条理。此外…

new mars3d.layer.GeoJsonLayer({实现图标点billboard贴模型聚合效果

说明&#xff1a; 1.【mars3d】的依赖库cesium本身是不支持贴地/贴模型操作的 2.sdk内部异步计算了数据的贴地/高度值之后&#xff0c;更新到图层上实现贴地/贴模型效果的 3.相关的示例链接&#xff1a; 1.功能示例(Vue版) | Mars3D三维可视化平台 | 火星科技 4.相关的计算…

Java基础 - 黑马

我是南城余&#xff01;阿里云开发者平台专家博士证书获得者&#xff01; 欢迎关注我的博客&#xff01;一同成长&#xff01; 一名从事运维开发的worker&#xff0c;记录分享学习。 专注于AI&#xff0c;运维开发&#xff0c;windows Linux 系统领域的分享&#xff01; 知…

构建搜索引擎,而不是向量数据库

英文原文地址&#xff1a;Build a search engine, not a vector DB 构建搜索引擎&#xff0c;而不是矢量数据库 2023 年 12 月 19 日 在过去12个月里&#xff0c;向量数据库初创公司数量激增。我并不是来讨论其中任何一个的具体设计权衡。相反&#xff0c;我想回顾一下向量数…

斯坦福CS231n学习笔记:DL与CV教程 (1) | 引言与知识基础

前言 &#x1f4da; 笔记专栏&#xff1a;斯坦福CS231N&#xff1a;面向视觉识别的卷积神经网络&#xff08;23&#xff09;&#x1f517; 课程链接&#xff1a;https://www.bilibili.com/video/BV1xV411R7i5&#x1f4bb; CS231n: 深度学习计算机视觉&#xff08;2017&#xf…

设计3题目:各种排序算法及性能分析

1、设计3目的 掌握各种内排序算法设计及其执行绝对时间&#xff0c;并对其时间性能进行比较。 2、设计3正文 2.1 实验内容 内容&#xff1a;编写一个程序&#xff0c;随机产生n个1-99的正整数序列&#xff0c;分别采用直接插入排序、折半插入排序、希尔排序、冒泡排序、快速…

什么是MongoDB

概念&#xff1a; MongoDB 是一个文档数据库&#xff08;以 JSON 为数据模型&#xff09;&#xff0c;由 C 语言编写&#xff0c;旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。 MongoDB 是一个介于关系数据库和非关系数据库之间的产品&#xff0c;是非关系数据库当中…

白光LED驱动芯片的典型应用电路

小型白光LED驱动器LM2751 LM2751是美国国家半导体&#xff08;NS&#xff09;公司推出的一款小型白光LED驱动器&#xff0c;采用10PINLLP无铅封装&#xff0c;内置固定频率的电荷泵&#xff0c;在输入电压为2.8V&#xff5e;5.5V的情况下&#xff0c;可稳压输出4.5V或5.0V电压…

【树莓派】网线远程连接电脑和树莓派,实现SSH连接

目录 1、硬件连接&#xff1b; 2、电脑端&#xff1a; 3、查找树莓派的IP地址 4、开启树莓派的SSH接口 5、putty 6、命令行 参考文章 通过网线连接笔记本与树莓派 开启SSH和VNC功能 无显示器安装树莓派 实现&#xff1a;打开putty输入树莓派地址使用ssh方式登陆&…

【XR806开发板试用】单总线协议驱动DHT11温湿度传感器

1.昨天刚收到极速社区寄来的全志XR806开发板&#xff0c;之前用过很多全志的SOC芯片&#xff0c;但是像这种无线芯片还是第一次用。这次打算使用XR806芯片驱动一下DHT11温湿度传感器。 2.代码如下&#xff1a; #include "common/framework/platform_init.h" #inclu…

【计算机网络】TCP原理 | 可靠性机制分析(四)

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【网络编程】 本专栏旨在分享学习计算机网络的一点学习心得&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 这里写目录标题 &#x1…

软信天成:数据安全管理解决方案分享

近年来&#xff0c;随着数据环境日趋复杂多变和潜在的数据隐私泄露风险潜伏&#xff0c;如何确保企业数据安全已成为众多企业亟待面对与妥善处理的重要问题。 为了应对这一严峻的现实挑战&#xff0c;软信天成凭借专业的知识体系和丰富的实战经验积累&#xff0c;总结出了一套…

【web服务搭建实验】之nginx基础学习

目录 一、nginx的简介二、nginx安装实验虚拟主机的配置web服务器的主流实现方式-LAMP和LNMP 一、nginx的简介 Nginx是一款轻量级HTTP服务器&#xff0c;同时也是代理邮箱服务器&#xff0c;具备反向代理&#xff0c;通用代理的功能。支持多个系统&#xff0c;和不同操作系统。…

如何注释 PDF?注释PDF文件方法详情介绍

大多数使用 PDF 文档的用户都熟悉处理这种格式的文件时出现的困难。有些人仍然认为注释 PDF 的唯一方法是打印文档&#xff0c;使用笔或荧光笔然后扫描回来。 您可能需要向 PDF 添加注释、添加注释、覆盖一些文本或几何对象。经理、部门负责人在编辑公司内的合同、订单、发票或…

lvgl简介

LVGL&#xff08;Light and Versatile Graphics Library&#xff09;是一个开源的图形用户界面库&#xff0c;旨在提供轻量级、可移植、灵活和易于使用的图形用户界面解决方案。 它适用于嵌入式系统&#xff0c;可以在不同的操作系统、微控制器和图形加速器上运行。LVGL的核心…

power shell 有哪些常用命令?

PowerShell是一种命令行外壳和脚本语言&#xff0c;它基于.NET Framework并专为系统管理员设计。下面是一些常用的PowerShell命令&#xff1a; Get-Process&#xff1a;获取运行的进程列表。Get-Service&#xff1a;获取运行的服务列表。Get-EventLog&#xff1a;获取事件日志…

基于uniapp的在线课程教学系统

介绍 项目背景&#xff1a; 随着互联网的快速发展&#xff0c;在线教育已经成为一种流行的学习方式。针对这一趋势&#xff0c;我们决定开发一个基于UniApp的在线课程教学系统。该系统旨在为学生提供方便快捷的在线学习体验&#xff0c;同时也为教师提供一个高效管理课程的平台…

【java八股文】之计算机网络系列篇

1、TCP/IP和UDP模型 TCP/IP分层&#xff08;4层&#xff09;&#xff1a;应用层&#xff0c;传输层&#xff0c;网络层&#xff0c;数据链路层 网络的七层架构 &#xff08;7层&#xff09;&#xff1a;应用层&#xff0c;表示层&#xff0c;会话层&#xff0c;传输层&#xff…