当前位置: 首页 > article >正文

Kotlin OpenCV 画画

Kotlin OpenCV 画画

  • 1 引入依赖
  • 2 测试代码
  • 3 测试结果

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>

    <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>

    <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.9.0-1.5.10</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>

</project>

2 测试代码

package com.xu.com.xu.image

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_imgproc
import org.bytedeco.opencv.opencv_core.Mat
import org.bytedeco.opencv.opencv_core.Point
import org.bytedeco.opencv.opencv_core.Scalar
import org.bytedeco.opencv.opencv_highgui.MouseCallback
import org.opencv.core.Core
import java.io.File
import java.util.*

object Drawing {

    init {
        val os = System.getProperty("os.name")
        val type = System.getProperty("sun.arch.data.model")
        if (os.uppercase(Locale.getDefault()).contains("WINDOWS")) {
            val lib = if (type.endsWith("64")) {
                File("lib\\opencv-4.9\\x64\\" + System.mapLibraryName(Core.NATIVE_LIBRARY_NAME))
            } else {
                File("lib\\opencv-4.9\\x86\\" + System.mapLibraryName(Core.NATIVE_LIBRARY_NAME))
            }
            System.load(lib.absolutePath)
        }
        println("OpenCV: ${Core.VERSION}")
    }

    // 使用 Kotlin 的数据类来存储鼠标状态
    data class MouseState(
        val image: Mat,
        var second: Point = Point(),
        var first: Point = Point(),
        var drawing: Boolean = false
    )

    @JvmStatic
    fun main(args: Array<String>) {
        change()
    }

    private fun change() {
        // 创建画布(白色背景)
        val image = Mat(700, 1000, opencv_core.CV_8UC3, Scalar(255.0, 255.0, 255.0, 0.0))
        val windowName = "Kotlin Mouse Drawing"

        // 创建窗口
        opencv_highgui.namedWindow(windowName, opencv_highgui.WINDOW_AUTOSIZE)

        // 创建状态对象
        val state = MouseState(image)

        // 创建鼠标回调对象
        val mouseCallback = object : MouseCallback() {
            override fun call(event: Int, x: Int, y: Int, flags: Int, params: Pointer?) {
                when (event) {
                    opencv_highgui.EVENT_LBUTTONDOWN -> {
                        state.drawing = true
                        state.first.x(x)
                        state.first.y(y)
                    }

                    opencv_highgui.EVENT_MOUSEMOVE -> {
                        if (state.drawing) {
                            state.second.x(x)
                            state.second.y(y)
                            // 画线(红色)
                            opencv_imgproc.line(
                                image,
                                state.first,
                                state.second,
                                Scalar(0.0, 0.0, 255.0, 0.0)
                            )
                            // 更新起点
                            state.first.x(state.second.x())
                            state.first.y(state.second.y())
                        }
                    }

                    opencv_highgui.EVENT_LBUTTONUP -> {
                        state.drawing = false
                    }
                }
            }
        }

        // 设置鼠标回调
        opencv_highgui.setMouseCallback(windowName, mouseCallback, null)

        // 主循环
        while (true) {
            opencv_highgui.imshow(windowName, image)
            if (opencv_highgui.waitKey(1).toChar() == 27.toChar()) {
                break
            }
        }
    }

}

3 测试结果

在这里插入图片描述


http://www.kler.cn/a/473374.html

相关文章:

  • Profinet转EtherNet/IP网关连接AB PLC的应用案例
  • Selenium 八大元素定位方法及场景扩展
  • FastAPI 的依赖注入与生命周期管理深度解析
  • 探索Whisper:从原理到实际应用的解析
  • Java SpringBoot使用EasyExcel导入导出Excel文件
  • 高等数学-----极限、函数、连续
  • QPS和TPS 的区别是什么?QPS 大了会有什么问题,怎么解决?
  • Java基础概念
  • EasyExcel上传校验文件错误信息放到文件里以Base64 返回给前端
  • springboot + vue+elementUI图片上传流程
  • TypeScript语言的数据库交互
  • 【JavaEE进阶】获取Cookie/Session
  • OpenCV相机标定与3D重建(48)对三台相机进行极线校正(rectification)函数rectify3Collinear()的使用
  • vue3使用vue3-video-play播放m3u8视频
  • CTF知识点总结(二)
  • Linux中彻底卸载Oracle 19.25单实例数据库
  • Ubuntu更改内核
  • Docker 部署 elasticsearch:7.14.0 与 kibana:7.14.0
  • HDMI转DVI或DVI转HDMI电路设计实例
  • 【Web】软件系统安全赛CachedVisitor——记一次二开工具的经历
  • 微信小程序实现登录注册
  • windows10下安装Microsoft SQL Server 2016
  • mysql性能测试优化
  • 【分糖果——DFS】
  • 面向对象分析与设计Python版 建模工具UML
  • k8s集群监控系统部署方案