Kotlin Bytedeco OpenCV 图像图像53 图像透视变换
1 添加依赖
<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.0modelVersion>
<groupId>com.xugroupId>
<artifactId>KotlinOpenCVartifactId>
<version>1.0version>
<properties>
<kotlin.version>2.0.0kotlin.version>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
<kotlin.code.style>officialkotlin.code.style>
<kotlin.compiler.jvmTarget>1.8kotlin.compiler.jvmTarget>
properties>
<repositories>
<repository>
<id>mavenCentralid>
<url>https://repo1.maven.org/maven2/url>
repository>
repositories>
<dependencies>
<dependency>
<groupId>cn.hutoolgroupId>
<artifactId>hutool-allartifactId>
<version>5.8.29version>
dependency>
<dependency>
<groupId>org.apache.commonsgroupId>
<artifactId>commons-compressartifactId>
<version>1.27.0version>
dependency>
<dependency>
<groupId>org.tukaanigroupId>
<artifactId>xzartifactId>
<version>1.10version>
dependency>
<dependency>
<groupId>org.jetbrains.kotlinxgroupId>
<artifactId>kotlinx-coroutines-coreartifactId>
<version>1.9.0-RCversion>
dependency>
<dependency>
<groupId>org.bytedecogroupId>
<artifactId>opencv-platformartifactId>
<version>4.10.0-1.5.11version>
dependency>
<dependency>
<groupId>org.jetbrains.kotlingroupId>
<artifactId>kotlin-test-junit5artifactId>
<version>2.0.0version>
<scope>testscope>
dependency>
<dependency>
<groupId>org.junit.jupitergroupId>
<artifactId>junit-jupiterartifactId>
<version>5.10.0version>
<scope>testscope>
dependency>
<dependency>
<groupId>org.jetbrains.kotlingroupId>
<artifactId>kotlin-stdlibartifactId>
<version>2.0.0version>
dependency>
dependencies>
<build>
<sourceDirectory>src/main/kotlinsourceDirectory>
<testSourceDirectory>src/test/kotlintestSourceDirectory>
<plugins>
<plugin>
<groupId>org.jetbrains.kotlingroupId>
<artifactId>kotlin-maven-pluginartifactId>
<version>2.0.0version>
<executions>
<execution>
<id>compileid>
<phase>compilephase>
<goals>
<goal>compilegoal>
goals>
execution>
<execution>
<id>test-compileid>
<phase>test-compilephase>
<goals>
<goal>test-compilegoal>
goals>
execution>
executions>
plugin>
<plugin>
<artifactId>maven-surefire-pluginartifactId>
<version>2.22.2version>
plugin>
<plugin>
<artifactId>maven-failsafe-pluginartifactId>
<version>2.22.2version>
plugin>
<plugin>
<groupId>org.codehaus.mojogroupId>
<artifactId>exec-maven-pluginartifactId>
<version>1.6.0version>
<configuration>
<mainClass>MainKtmainClass>
configuration>
plugin>
plugins>
build>
project>
2 测试代码
package com.xu.com.xu.image
import 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.Point
import org.bytedeco.opencv.opencv_core.Point2f
import org.bytedeco.opencv.opencv_core.Scalar
import org.bytedeco.opencv.opencv_highgui.MouseCallback
object ImageChange {
init {
Loader.load(opencv_core::class.java)
}
@JvmStatic
fun main(args: Array<String>) {
perspective(1)
}
private fun perspective(type: Int) {
val src = opencv_imgcodecs.imread("C:\\Users\\xuyq\\Desktop\\1.png")
if (src == null || src.empty()) {
return
}
val org = Mat(1, 4, opencv_core.CV_32FC2)
org.ptr(0, 0).put<Pointer>(Point2f(0f, 0f))
org.ptr(0, 1).put<Pointer>(Point2f(src.cols().toFloat(), 0f))
org.ptr(0, 2).put<Pointer>(Point2f(src.cols().toFloat(), src.rows().toFloat()))
org.ptr(0, 3).put<Pointer>(Point2f(0f, src.rows().toFloat()))
val dst = Mat(1, 4, opencv_core.CV_32FC2)
if (1 == type) {
val target = click(src)
for (i in target.indices) {
dst.ptr(0, i).put<Pointer>(target[i])
}
} else {
dst.ptr(0, 0).put<Pointer>(Point2f(21f, 20f))
dst.ptr(0, 1).put<Pointer>(Point2f(953f, 74f))
dst.ptr(0, 2).put<Pointer>(Point2f(847f, 574f))
dst.ptr(0, 3).put<Pointer>(Point2f(109f, 643f))
}
val matrix = opencv_imgproc.getPerspectiveTransform(org, dst)
val images = Mat()
opencv_imgproc.warpPerspective(src, images, matrix, src.size())
opencv_highgui.imshow("Perspective", images)
opencv_highgui.waitKey(0)
}
private fun affine() {
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(0f, src.rows().toFloat()))
mat1.ptr(0, 2).put<Pointer>(Point2f(src.cols().toFloat(), 0f))
val mat2 = Mat(1, 3, opencv_core.CV_32FC2)
mat2.ptr(0, 0).put<Pointer>(Point2f(src.cols() * 0.3f, src.cols() * 0.3f))
mat2.ptr(0, 1).put<Pointer>(Point2f(src.cols() * 0.2f, src.cols() * 0.6f))
mat2.ptr(0, 2).put<Pointer>(Point2f(src.cols() * 0.7f, src.cols() * 0.2f))
val matrix = opencv_imgproc.getAffineTransform(mat1, mat2)
val images = Mat()
opencv_imgproc.warpAffine(src, images, matrix, src.size())
opencv_highgui.imshow("Affine", images)
opencv_highgui.waitKey(0)
}
private fun rotation() {
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("Rotation", images)
opencv_highgui.waitKey(0)
}
private fun click(image: Mat): List<Point2f> {
val window = "Click"
opencv_highgui.namedWindow(window, opencv_highgui.WINDOW_AUTOSIZE)
val points = listOf<Point2f>().toMutableList()
val callback = object : MouseCallback() {
override fun call(event: Int, x: Int, y: Int, flags: Int, params: Pointer?) {
when (event) {
opencv_highgui.EVENT_LBUTTONDOWN -> {
println("点击点: ($x, $y)")
points.add(Point2f(x.toFloat(), y.toFloat()))
opencv_imgproc.circle(
image, Point(x, y), 5,
Scalar(0.0, 0.0, 255.0, 0.0), -1, opencv_imgproc.LINE_AA, 0
)
opencv_highgui.imshow(window, image)
}
}
}
}
opencv_highgui.setMouseCallback(window, callback, null)
while (true) {
opencv_highgui.imshow(window, image)
if (opencv_highgui.waitKey(1).toChar() == 27.toChar() || points.size >= 4) {
opencv_highgui.destroyWindow(window)
break
}
}
return points
}
}
3 测试结果
