Kotlin Bytedeco OpenCV 图像图像50 仿射变换 图像缩放

Kotlin Bytedeco OpenCV 图像图像50 仿射变换 图像缩放

  • 1 添加依赖
  • 2 测试代码
  • 3 测试结果

在OpenCV中,仿射变换(Affine Transformation)和透视变换(Perspective Transformation)是两种常用的图像几何变换方法。

变换方法适用场景
仿射变换简单的几何变换(平移、旋转、缩放、剪切)。
透视变换改变图像视角和模拟3D投影效果。
变换方法解释特点应用场景实现方法
仿射变换仿射变换是一种线性变换,它保持了图像中直线的直线性和平行线的平行性。常见的仿射变换包括平移、旋转、缩放、剪切等。输入空间和输出空间之间存在线性关系。
直线和平行性在变换后保持不变,但角度和长度可能发生改变。
图像平移、旋转或缩放。
图像对齐(如在模板匹配中的坐标对齐)。
简单的几何变形,如剪切变换。
准备变换矩阵(2x3)。
使用 OpenCV 的 cv2.warpAffine() 方法进行变换。
透视变换透视变换是一种非线性变换,用于将图像从一个平面映射到另一个平面。它允许改变图像的视角,从而获得三维的透视效果。输入空间和输出空间之间是非线性的。
直线保持直线,但平行线不再平行。
需要 4 对点来定义变换关系。
图像校正(如将拍摄的书本照片调整为平面图)。
视角转换(如模拟3D效果或鸟瞰视图)。
投影变换(如在增强现实中的投影映射)。
定义输入和输出平面上的 4 个对应点。
使用 cv2.getPerspectiveTransform() 获取 3x3 的透视变换矩阵。
使用 cv2.warpPerspective() 方法进行变换。

1 添加依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://maven.apache.org/POM/4.0.0"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.xu</groupId><artifactId>KotlinOpenCV</artifactId><version>1.0</version><properties><kotlin.version>2.0.0</kotlin.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><kotlin.code.style>official</kotlin.code.style><kotlin.compiler.jvmTarget>1.8</kotlin.compiler.jvmTarget></properties><repositories><repository><id>mavenCentral</id><url>https://repo1.maven.org/maven2/</url></repository></repositories><dependencies><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.29</version></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-compress</artifactId><version>1.27.0</version></dependency><dependency><groupId>org.tukaani</groupId><artifactId>xz</artifactId><version>1.10</version></dependency><dependency><groupId>org.jetbrains.kotlinx</groupId><artifactId>kotlinx-coroutines-core</artifactId><version>1.9.0-RC</version></dependency><!--        <dependency>--><!--            <groupId>org.opencv</groupId>--><!--            <artifactId>opencv</artifactId>--><!--            <version>4100</version>--><!--            <scope>system</scope>--><!--            <systemPath>${project.basedir}/lib/opencv/opencv-4100.jar</systemPath>--><!--        </dependency>--><dependency><groupId>org.bytedeco</groupId><artifactId>opencv-platform</artifactId><version>4.10.0-1.5.11</version></dependency><!--        <dependency>--><!--            <groupId>org.bytedeco</groupId>--><!--            <artifactId>ffmpeg-platform</artifactId>--><!--            <version>6.1.1-1.5.10</version>--><!--        </dependency>--><dependency><groupId>org.jetbrains.kotlin</groupId><artifactId>kotlin-test-junit5</artifactId><version>2.0.0</version><scope>test</scope></dependency><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><version>5.10.0</version><scope>test</scope></dependency><dependency><groupId>org.jetbrains.kotlin</groupId><artifactId>kotlin-stdlib</artifactId><version>2.0.0</version></dependency></dependencies><build><sourceDirectory>src/main/kotlin</sourceDirectory><testSourceDirectory>src/test/kotlin</testSourceDirectory><plugins><plugin><groupId>org.jetbrains.kotlin</groupId><artifactId>kotlin-maven-plugin</artifactId><version>2.0.0</version><executions><execution><id>compile</id><phase>compile</phase><goals><goal>compile</goal></goals></execution><execution><id>test-compile</id><phase>test-compile</phase><goals><goal>test-compile</goal></goals></execution></executions></plugin><plugin><artifactId>maven-surefire-plugin</artifactId><version>2.22.2</version></plugin><plugin><artifactId>maven-failsafe-plugin</artifactId><version>2.22.2</version></plugin><plugin><groupId>org.codehaus.mojo</groupId><artifactId>exec-maven-plugin</artifactId><version>1.6.0</version><configuration><mainClass>MainKt</mainClass></configuration></plugin></plugins></build></project>

2 测试代码

package com.xu.com.xu.transimport org.bytedeco.javacpp.Loader
import org.bytedeco.javacpp.Pointer
import org.bytedeco.opencv.global.opencv_core
import org.bytedeco.opencv.global.opencv_highgui
import org.bytedeco.opencv.global.opencv_imgcodecs
import org.bytedeco.opencv.global.opencv_imgproc
import org.bytedeco.opencv.opencv_core.Mat
import org.bytedeco.opencv.opencv_core.Point2f
import org.bytedeco.opencv.opencv_core.Rect
import org.bytedeco.opencv.opencv_core.Sizeobject Affine {init {Loader.load(opencv_core::class.java)}@JvmStaticfun main(args: Array<String>) {zoom()}/*** 仿射变换 平移变换** @since 2025年1月20日12点33分*/private fun move() {// 读取图像val src = opencv_imgcodecs.imread("C:\\Users\\hyacinth\\Desktop\\1.png")if (src == null || src.empty()) {return}// 创建源点矩阵三个点val mat1 = Mat(1, 3, opencv_core.CV_32FC2)mat1.ptr(0, 0).put<Pointer>(Point2f(0f, 0f))mat1.ptr(0, 1).put<Pointer>(Point2f(src.cols() - 1f, 0f))mat1.ptr(0, 2).put<Pointer>(Point2f(0f, src.rows() - 1f))// 创建目标点矩阵三个点val mat2 = Mat(1, 3, opencv_core.CV_32FC2)mat2.ptr(0, 0).put<Pointer>(Point2f(100f, 100f))mat2.ptr(0, 1).put<Pointer>(Point2f(src.cols() + 100f, 100f))mat2.ptr(0, 2).put<Pointer>(Point2f(100f, src.rows() + 100f))// 获取旋转矩阵val matrix = opencv_imgproc.getAffineTransform(mat1, mat2)// 应用透视变换val images = Mat()opencv_imgproc.warpAffine(src, images, matrix, src.size())// 显示结果opencv_highgui.imshow("MOVE", images)opencv_highgui.waitKey(0)}/*** 仿射变换 旋转变换** @since 2025年1月20日12点33分*/private fun revolve() {// 读取图像val src = opencv_imgcodecs.imread("C:\\Users\\hyacinth\\Desktop\\1.png")if (src == null || src.empty()) {return}// 旋转中心val center = Point2f((src.cols() / 2).toFloat(), (src.rows() / 2).toFloat())// 获取旋转矩阵val matrix = opencv_imgproc.getRotationMatrix2D(center, 45.0, 0.5)// 应用透视变换val images = Mat()opencv_imgproc.warpAffine(src, images, matrix, src.size())// 显示结果opencv_highgui.imshow("REVOLVE", images)opencv_highgui.waitKey(0)}/*** 仿射变换 图像缩放** @since 2025年1月20日12点33分*/private fun zoom() {// 读取图像val src = opencv_imgcodecs.imread("C:\\Users\\hyacinth\\Desktop\\1.png")if (src == null || src.empty()) {return}// 旋转中心val center = Point2f((src.cols() / 2).toFloat(), (src.rows() / 2).toFloat())// 获取旋转矩阵val matrix = opencv_imgproc.getRotationMatrix2D(center, 0.0, 0.5)// 应用透视变换val images = Mat()opencv_imgproc.warpAffine(src, images, matrix, src.size())// 显示结果opencv_highgui.imshow("REVOLVE", images)opencv_highgui.waitKey(0)}/*** 仿射变换 图像裁剪** @since 2025年1月20日12点33分*/private fun cropping1() {// 读取图像val src = opencv_imgcodecs.imread("C:\\Users\\hyacinth\\Desktop\\1.png")if (src == null || src.empty()) {return}// 定义裁剪区域val rect = Rect(100, 100, 400, 200)// 应用透视变换val images = Mat(src, rect)// 显示结果opencv_highgui.imshow("CROPPING", images)opencv_highgui.waitKey(0)}/*** 仿射变换 图像裁剪** @since 2025年1月20日12点33分*/private fun cropping1(type: Int) {// 读取图像val src = opencv_imgcodecs.imread("C:\\Users\\hyacinth\\Desktop\\1.png")if (src == null || src.empty()) {return}val dst = Mat()opencv_imgproc.getRectSubPix(src,Size(400, 200), // 裁剪大小Point2f((src.rows() / 2.0).toFloat(), (src.cols() / 2.0).toFloat()), // 裁剪图片中心dst)// 显示ROIopencv_highgui.imshow("src", src)opencv_highgui.imshow("dst", dst)opencv_highgui.waitKey(0)}}

3 测试结果

在这里插入图片描述

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

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

相关文章

回归预测 | MATLAB基于TCN-BiGRU时间卷积神经网络结合双向门控循环单元多输入单输出回归预测

效果一览 基本介绍 回归预测 | MATLAB基于TCN-BiGRU时间卷积神经网络结合双向门控循环单元多输入单输出回归预测 一、引言 1.1、研究背景及意义 在当今数据驱动的时代&#xff0c;时间序列预测已成为金融、气象、工业控制等多个领域的关键技术。随着人工智能和机器学习技术的…

TMC2208替代A4988

前言 TMC2208 是一款先进的 1 轴步进驱动器&#xff0c;支持 stealthChop ™和 256 微步。本应用说明介绍了如何设置 TMC2208 以替代 A4988&#xff08;传统模式&#xff09;。 引脚比较 与其他电机驱动器相比&#xff0c;TMC2208 具有附加功能&#xff1a;256 微步。 自动…

多层 RNN原理以及实现

数学原理 多层 RNN 的核心思想是堆叠多个 RNN 层&#xff0c;每一层的输出作为下一层的输入&#xff0c;从而逐层提取更高层次的抽象特征。 1. 单层 RNN 的数学表示 首先&#xff0c;单层 RNN 的计算过程如下。对于一个时间步 t t t&#xff0c;单层 RNN 的隐藏状态 h t h_t…

数据结构——AVL树的实现

Hello&#xff0c;大家好&#xff0c;这一篇博客我们来讲解一下数据结构中的AVL树这一部分的内容&#xff0c;AVL树属于是数据结构的一部分&#xff0c;顾名思义&#xff0c;AVL树是一棵特殊的搜索二叉树&#xff0c;我们接下来要讲的这篇博客是建立在了解搜索二叉树这个知识点…

【日志篇】(7.6) ❀ 01. 在macOS下刷新FortiAnalyzer固件 ❀ FortiAnalyzer 日志分析

【简介】FortiAnalyzer 是 Fortinet Security Fabric 安全架构的基础&#xff0c;提供集中日志记录和分析&#xff0c;以及端到端可见性。因此&#xff0c;分析师可以更有效地管理安全状态&#xff0c;将安全流程自动化&#xff0c;并快速响应威胁。具有分析和自动化功能的集成…

【KOA框架】koa框架基础及swagger接口文档搭建

koa是express的一层封装&#xff0c;语法比express更加简洁。所以有必要了解下koa的相关开发方法。 代码实现 package.json {"name": "koapp","version": "1.0.0","main": "index.js","scripts": {…

[深度学习]机器学习和深度学习

机器学习和深度学习 文章目录 机器学习和深度学习人工智能与机器学习和深度学习的关系侠义的机器学习深度学习的概念常见的神经网络的输入形式想要的输出(任务类别)深度学习的流程 线性函数与多层神经元 人工智能与机器学习和深度学习的关系 所谓人工智能就是&#xff0c;让计算…

【QT】已解决:Qt4.11.0无法使用MSVC编译器问题

目录 一、背景 1.本机环境 2.问题描述 3.问题解决前后对比图 二、详细操作 1.下载项目二所需qt环境 2.解决思路 3.安装VS2017 4.安装MSVC调试器 5.打开qtCreator查看编译器 5.编译运行项目二 三、参考 一、背景 1.本机环境 windows11 qtCreator4.11.0 minGW 64位…

C++ 模拟真人鼠标轨迹算法 - 防止游戏检测

一.简介 鼠标轨迹算法是一种模拟人类鼠标操作的程序&#xff0c;它能够模拟出自然而真实的鼠标移动路径。 鼠标轨迹算法的底层实现采用C/C语言&#xff0c;原因在于C/C提供了高性能的执行能力和直接访问操作系统底层资源的能力。 鼠标轨迹算法具有以下优势&#xff1a; 模拟…

从零开始:Spring Boot核心概念与架构解析

引言 在当今的Java开发领域&#xff0c;Spring Boot已经成为构建企业级应用的首选框架之一。它以其简洁、高效、易于上手的特点&#xff0c;极大地简化了Spring应用的开发过程。本文将从Spring Boot的核心概念入手&#xff0c;深入解析其架构设计和运行原理&#xff0c;帮助读…

【EdgeAI实战】(1)STM32 边缘 AI 生态系统

【EdgeAI实战】&#xff08;1&#xff09;STM32 边缘 AI 生态系统 【EdgeAI实战】&#xff08;1&#xff09;STM32 边缘 AI 生态系统 1. STM32 边缘人工智能1.1 X-CUBE-AI 扩展包1.2 STM32 AI Model Zoo1.3 ST AIoT Craft 2. STM32N6 AI 生态系统 (STM32N6-AI)2.1 STM32N6 AI 产…

SSE 实践:用 Vue 和 Spring Boot 实现实时数据传输

前言 大家好&#xff0c;我是雪荷。最近我在灵犀 BI 项目中引入了 SSE 技术&#xff0c;以保证图表的实时渲染&#xff0c;当图表渲染完毕服务端推送消息至浏览器端触发重新渲染。 什么是 SSE&#xff1f; SSE 全称为 Server-Send Events 意思是服务端推送事件。 SSE 相比于 …

关于机器学习的一份总结

在之前的文章中分别有详细的关于机器学习中某一学习算法的介绍&#xff0c;但缺少一个总体关于机器学习的总结&#xff0c;所以在这篇文中就是关于机器学习的一份总结。 在最近的日子中&#xff0c;人工智能日益火热起来&#xff0c;而机器学习是其中举足轻重的一部分&#xf…

浅谈计算机网络03 | 现代网络组成

现代网络组成 一 、网络生态体系1.1网络生态系统的多元主体1.2 网络接入设施的多样类型 二、现代网络的典型体系结构解析三、高速网络技术3.1 以太网技术3.2 Wi-Fi技术的深度剖析3.2.1 应用场景的多元覆盖3.2.2 标准升级与性能提升 3.3 4G/5G蜂窝网的技术演进3.3.1 蜂窝技术的代…

数据结构漫游记:队列的动态模拟实现(C语言)

嘿&#xff0c;各位技术潮人&#xff01;好久不见甚是想念。生活就像一场奇妙冒险&#xff0c;而编程就是那把超酷的万能钥匙。此刻&#xff0c;阳光洒在键盘上&#xff0c;灵感在指尖跳跃&#xff0c;让我们抛开一切束缚&#xff0c;给平淡日子加点料&#xff0c;注入满满的pa…

Ubuntu22.04安装paddle GPU版本

文章目录 确立版本安装CUDA与CUDNN安装paddle 确立版本 查看官网信息&#xff0c;确立服务版本&#xff1a;https://www.paddlepaddle.org.cn/documentation/docs/zh/2.6/install/pip/linux-pip.html 安装CUDA与CUDNN 通过nvidia-smi查看当前显卡驱动版本&#xff1a; 通过…

2024年度总结:从后端Java到全栈成长的蜕变

目录 前言1. 用数据与实践书写成长篇章2. 技术与生活的双重蜕变3. 技术的进阶与生活的绽放 前言 今年是我入行的第十年&#xff0c;也是记录在CSDN平台上的第五年。这五年来&#xff0c;我始终坚持记录成长的点滴&#xff0c;将个人事业与博客创作紧密相连。一路走来&#xff0…

麦田物语学习笔记:创建TransitionManager控制人物场景切换

基本流程 制作场景之间的切换 1.代码思路 (1)为了实现不同场景切换,并且保持当前的persistentScene一直存在,则需要一个Manager去控制场景的加载和卸载,并且在加载每一个场景之后,都要将当前的场景Set Active Scene,保证其为激活的场景,在卸载的时候也可以方便调用当前激活的场…

无人机高速无刷动力电机核心设计技术

一、技术概述 无刷电机优势&#xff1a; 高效率&#xff1a;无刷电机由于去除了电刷和换向器&#xff0c;减少了能量损失&#xff0c;因此具有更高的效率。 长寿命&#xff1a;电刷和换向器的磨损是导致传统有刷电机寿命较短的主要原因&#xff0c;而无刷电机则避免了这一问…

Linux C\C++方式下的文件I/O编程

【图书推荐】《Linux C与C一线开发实践&#xff08;第2版&#xff09;》_linux c与c一线开发实践pdf-CSDN博客 《Linux C与C一线开发实践&#xff08;第2版&#xff09;&#xff08;Linux技术丛书&#xff09;》(朱文伟&#xff0c;李建英)【摘要 书评 试读】- 京东图书 Lin…