欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 美食 > Kotlin Bytedeco OpenCV 图像图像50 仿射变换 图像缩放

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

2025/1/22 9:37:33 来源:https://blog.csdn.net/qq_34814092/article/details/145258356  浏览:    关键词: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 测试结果

在这里插入图片描述

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com