Kotlin Bytedeco OpenCV 图像图像57 图像ROI
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. trans
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. Rect
import org. bytedeco. opencv. opencv_core. Scalar
import org. bytedeco. opencv. opencv_core. Size
import org. bytedeco. opencv. opencv_highgui. MouseCallback
object Cropping {
init {
Loader. load ( opencv_core:: class . java)
}
data class MouseState (
val image: Mat
) {
lateinit var temp: Mat
var second: Point = Point ( )
var first: Point = Point ( )
var drawing: Boolean = false
}
@JvmStatic
fun main ( args: Array< String> ) {
roi ( )
}
private fun roi ( ) {
val src = opencv_imgcodecs. imread ( "C:\\Users\\hyacinth\\Desktop\\1.png" )
if ( src == null || src. empty ( ) ) {
return
}
val ( size, point) = select ( src)
println ( " ${ point. x ( ) } , ${ point. x ( ) } " )
val dst = Mat ( )
opencv_imgproc. getRectSubPix (
src,
size,
Point2f ( point) ,
dst
)
opencv_highgui. imshow ( "src" , src)
opencv_highgui. imshow ( "dst" , dst)
opencv_highgui. waitKey ( 0 )
}
private fun roi2 ( ) {
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 ( "ORACLE" , src)
opencv_highgui. imshow ( "CROPPING" , images)
opencv_highgui. waitKey ( 0 )
}
private fun roi3 ( 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
)
opencv_highgui. imshow ( "src" , src)
opencv_highgui. imshow ( "dst" , dst)
opencv_highgui. waitKey ( 0 )
}
private fun select ( image: Mat) : Pair< Size, Point2f> {
val window = "Drawing"
opencv_highgui. namedWindow ( window, opencv_highgui. WINDOW_AUTOSIZE)
val state = MouseState ( image)
state. temp = image. clone ( )
val callback = 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. temp = state. image. clone ( )
state. second. x ( x)
state. second. y ( y)
opencv_imgproc. rectangle (
state. temp,
Rect ( Point ( state. first) , Point ( state. second) ) ,
Scalar ( 255.0 , 0.0 , 0.0 , 0.0 )
)
opencv_highgui. imshow ( window, state. temp)
}
}
opencv_highgui. EVENT_LBUTTONUP -> {
state. drawing = false
state. second. x ( x)
state. second. y ( y)
opencv_imgproc. rectangle (
state. image,
Rect ( Point ( state. first) , Point ( state. second) ) ,
Scalar ( 0.0 , 255.0 , 0.0 , 0.0 )
)
opencv_highgui. imshow ( window, state. image)
}
}
}
}
opencv_highgui. setMouseCallback ( window, callback, null )
while ( true ) {
opencv_highgui. imshow ( window, state. temp)
if ( opencv_highgui. waitKey ( 1 ) . toChar ( ) == 27 . toChar ( ) ) {
opencv_highgui. destroyWindow ( window)
return Pair (
Size (
state. second. x ( ) - state. first. x ( ) ,
state. second. y ( ) - state. first. y ( )
) ,
Point2f (
( 0.5 * state. second. x ( ) + 0.5 * state. first. x ( ) ) . toFloat ( ) ,
( 0.5 * state. second. y ( ) + 0.5 * state. first. y ( ) ) . toFloat ( )
)
)
}
}
}
}
3 测试结果