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

在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()会返回trueif (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设置为0Core.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()会返回trueif (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进行图片翻转和图片旋转

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

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

相关文章

MySQL面试题 | 02.精选MySQL面试题

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

vim基本操作命令

一、vi简介 vi是“Visual interface”的简称&#xff0c;它在Linux上的地位就仿佛Edit程序在DOS上一样。它可以执行输出、删除、查找、替换、块操作等众多文本操作&#xff0c;而且用户可以根据自己的需要对其进行定制。Vi不是一个排版程序&#xff0c;它不象Word或WPS那样可以…

商城小程序(8.购物车页面)

目录 一、商品列表区域1、渲染购物车商品列表的标题区域2、渲染商品列表区域的基本结构3、为my-goods组件封装radio勾选状态4、为my-goods组件封装radio-change事件5、修改购物车中商品的选择状态6、为my-goods组件封装NumberBox7、为my-goods封装num-change事件8、修改购物车商…

【论文笔记】End-to-End Diffusion Latent Optimization Improves Classifier Guidance

Abstract Classifier guidance为图像生成带来了控制&#xff0c;但是需要训练新的噪声感知模型(noise-aware models)来获得准确的梯度&#xff0c;或使用最终生成的一步去噪近似&#xff0c;这会导致梯度错位(misaligned gradients)和次优控制(sub-optimal control)。 梯度错位…

jmeter--1.安装

目录 1. jmeter和jdk下载地址 2. jdk环境变量配置 3. Jmeter的环境变量配置 1. jmeter和jdk下载地址 链接&#xff1a;https://pan.baidu.com/s/1C8ItsR8ZUGJO9uyTJ-9QtQ?pwdx5m5 提取码&#xff1a;x5m5 2. jdk环境变量配置 2.1 我的电脑右键属性-->高级系统设置--&…

20240111在ubuntu20.04.6下解压缩RAR格式的压缩包

20240111在ubuntu20.04.6下解压缩RAR格式的压缩包 2024/1/11 18:25 百度搜搜&#xff1a;ubuntu rar文件怎么解压 rootrootrootroot-X99-Turbo:~/temp$ ll total 2916 drwx------ 3 rootroot rootroot 4096 1月 11 18:28 ./ drwxr-xr-x 25 rootroot rootroot 4096 1月…

详细分析Java中的分布式任务调度框架 XXL-Job

目录 前言1. 基本知识2. Demo3. 实战 前言 可视化任务调度 可视化配置 1. 基本知识 在Java中&#xff0c;分布式任务调度框架 XXL-Job 是一个开源的分布式任务调度平台&#xff0c;用于实现分布式系统中的定时任务调度和分布式任务执行。 下面是关于XXL-Job的一些概念、功…

05- OpenCV:图像操作和图像混合

目录 一、图像操作 1、读写图像 2、读写像素 3、修改像素值 4、Vec3b与Vec3F 5、相关的代码演示 二、图像混合 1、理论-线性混合操作 2、相关API(addWeighted) 3、代码演示&#xff08;完整的例子&#xff09; 一、图像操作 1、读写图像 &#xff08;1&#xff09;…

IDC机房服务器搬迁之运行了几年的服务器没关过机,今天关机下架,再上架突然起不来了,怎么快速处理?

环境 戴尔R420 服务器 1U 2台直连存储 4U CentOS 7 问题描述 IDC机房服务器搬迁之运行了几年的服务器没关过机,今天关机下架,再上架突然起不来了,怎么快速处理? 服务器上电开机就出现进入紧急模式 Welcome to emergency mode! After logging in, type “journalctl …

MYSQL篇--锁机制高频面试题

Mysql锁机制 1对mysql的锁有了解吗&#xff1f; 首先我们要知道&#xff0c;mysql的锁 其实是为了解决在并发事务时所导致的数据不一致问题的一种处理机制&#xff0c;也就是说 在事务的隔离级别实现中&#xff0c;就需要利用锁来解决幻读问题 然后我们可以聊到锁的分类 按锁…

软件测试|使用Python读取CSV文件的详细指南

简介 CSV&#xff08;Comma-Separated Values&#xff09;是一种常用的数据存储格式&#xff0c;它以逗号为分隔符将数据以文本形式存储在文件中。Python是一门强大的编程语言&#xff0c;提供了许多库和工具&#xff0c;使得读取和处理CSV文件变得非常简便。在本文中&#xf…

conda环境下cannot write keep file问题解决

1 问题描述 conda环境下执行如下命令报错&#xff1a; pip install githttps://github.com/wenet-e2e/wenet.git 错误信息如下&#xff1a; (pt) PS D:\code\ptcontainer> pip install githttps://github.com/wenet-e2e/wenet.git Looking in indexes: http://pypi.doub…

windows安装RabbitMq,修改数据保存位置

1、先安装Erlang&#xff0c; Erlang和RabbitMQ有版本对应关系。 官网RabbitMQ与Erlang版本对应RabbitMQ Erlang Version Requirements — RabbitMQ 2、安装RabbitMQ。 3、修改数据保存地址。找到安装目录下的sbin文件夹&#xff0c;找到rabbitmq-env.bat&#xff0c;编辑文件…

Windows和Linux安装jdk

一、Windows安装jdk 1、下载安装包 Jdk官网下载地址&#xff1a;Java Downloads | Oracle 需要登陆Oracle账号信息。 百度网盘下载地址&#xff1a;https://pan.baidu.com/s/1eN1PX6gKdKgwJ24CM0bDsw 提取码&#xff1a;4bpp 目前最新jdk的版本是21&#xff0c;可以下载不同…

SQL SERVER 19安装 SQL Prompt 10.02版本

SQL Prompt最新版官网下载地址&#xff1a;https://download.red-gate.com/SQLPromptDownload.exe 下载完成后&#xff0c;断开网络&#xff0c;全部点下一步。 注册机会报毒&#xff0c;安装前请先关闭杀毒软件&#xff01; 下载好附件之后解压&#xff0c;打开SQLPrompt_7…

深入理解 Flink(六)Flink Job 提交和 Flink Graph 详解

Flink Program 编程套路回顾 1、获取执行环境对象 StreamExecutionEnvironment env StreamExecutionEnvironment.getExecutionEnvironment(); 2、通过执行环境对象&#xff0c;注册数据源 Source&#xff0c;得到数据抽象 DataStream ds env.socketTextStream(...) 3、调用数…

python统计分析——小提琴图(plt.violinplot)

参考资料&#xff1a;用python动手学统计学&#xff0c;帮助文档 使用matplotlib.pyplot.violinplot()函数绘制小提琴图 小提琴图是将数值型数据的核密度图与箱线图融合在一起&#xff0c;具体来说是用核密度估计的结果替换了箱子&#xff0c;而形成的一个形似小提琴的图形。 …

openssl3.2 - 在VS2019下源码调试openssl.exe

文章目录 openssl3.2 - 在VS2019下源码调试openssl.exe概述笔记先看一个用.bat调用openssl干活的实例VS2019调试参数设置设置 - 命令参数设置 - 工作目录设置 - 环境变量将命令行中需要的文件拷贝到exe目录单步调试备注END openssl3.2 - 在VS2019下源码调试openssl.exe 概述 …

Java面试题之JVM

Java面试题之JVM 1. JVM的组成部分及其作用&#xff1f;2. JVM的堆和栈的区别&#xff1f;3. 简述一下垃圾回收机制&#xff1f;(垃圾回收的原理&#xff1f;)4. 垃圾回收器都有什么&#xff1f;该怎么选择&#xff1f;5. 如何判断垃圾可以回收了&#xff1f;6. 垃圾回收算法有…

vue3的福音框架arco.design

前言&#xff1a; 在vue2于2023年底正式宣布不在维护&#xff0c;vue3使用越来越频繁的时刻&#xff0c;我们实现项目的辅助框架也越来越多。element, iview, antd 等经典框架继续风靡一时&#xff0c;不过也有很多好的框架&#xff0c;功能也强大&#xff0c;比如我们今天说的…