gpt4 book ai didi

spring-boot - Spring Boot 应用程序中的 Tesseract 为日语提供了无意义的结果

转载 作者:行者123 更新时间:2023-11-28 22:24:30 24 4
gpt4 key购买 nike

我正在编写一个使用 Bytedeco's Java Wrapper for Tesseract OCR 的 Spring Boot 应用程序解析日语文本。在 Spring Boot 外部运行时,我已经设法让 Tesseract 正常工作,但是当我在 Spring Boot 应用程序中使用它时,它给我带来了无意义的结果。

例如,给定以下图像:

坊ちゃん 夏目漱石

如果我运行以下函数,结果是合理的:

fun main() {
val api = tesseract.TessBaseAPI()
api.Init("src/main/resources/tessdata", "jpn_vert")
api.SetPageSegMode(tesseract.PSM_SINGLE_BLOCK_VERT_TEXT)
val pixImage = lept.pixRead("src/main/resources/image.png")
api.SetImage(pixImage)
val result = api.GetUTF8Text()
System.out.println("Parsed text: " + result?.string)
}

打印:

Parsed text:
坊っちゃん
夏目 滞 石

但是,如果我从 Spring Boot Web Socket 中运行它,结果不是:

@SpringBootApplication
open class BootApplication

fun main(args: Array<String>) {
runApplication<BootApplication>(*args)
}

@Configuration
@EnableWebSocket
open class WebSocketConfiguration: WebSocketConfigurer {
@Bean
open fun createWebSocketContainer(): ServletServerContainerFactoryBean {
val container = ServletServerContainerFactoryBean()
container.maxBinaryMessageBufferSize = 1024000
return container
}

override fun registerWebSocketHandlers(registry: WebSocketHandlerRegistry) {
registry.addHandler(Endpoint(), "/parse").setAllowedOrigins("*")
}
}

class Endpoint: AbstractWebSocketHandler() {
@Throws(IOException::class)
override fun handleBinaryMessage(session: WebSocketSession?, message: BinaryMessage?) {
// Same code as above:
val api = tesseract.TessBaseAPI()
api.Init("src/main/resources/tessdata", "jpn_vert")
api.SetPageSegMode(tesseract.PSM_SINGLE_BLOCK_VERT_TEXT)
val pixImage = lept.pixRead("src/main/resources/image.png")
api.SetImage(pixImage)
val result = api.GetUTF8Text()
System.out.println("Parsed text:\n" + result?.string)
}
}

调用 handleBinaryMessage 时打印以下内容:

Parsed text:
蝮翫▲縺。繧?繧?
螟冗岼 貊? 遏ウ

我对一些英文文本进行了快速测试并且效果很好,所以我认为这个问题是特定于语言的。

我正在使用启动 Apache Tomcat 服务的 Spring Boot Gradle 插件中的 bootRun 任务运行 Boot 应用程序。我的第一个想法是,这与 Tesseract 包装器是一个 JNI 库并且它运行的环境 (Tomcat) 不同这一事实有关。如果是这样,是否需要进行一些额外的配置才能让 Tesseract 与 Spring Boot 和 Tomcat 一起工作?

作为引用,我的build.gradle如下:

plugins {
id 'org.jetbrains.kotlin.jvm' version '1.3.10'
id("org.springframework.boot") version "2.1.0.RELEASE"
}

repositories {
mavenCentral()
}

dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
implementation group: "org.bytedeco.javacpp-presets", name: "tesseract", version: "4.0.0-rc2-1.4.3"
implementation group: "org.bytedeco.javacpp-presets", name: "tesseract", version: "4.0.0-rc2-1.4.3", classifier: "windows-x86_64"
implementation group: "org.bytedeco.javacpp-presets", name: "leptonica", version: "1.76.0-1.4.3", classifier: "windows-x86_64"
implementation group: "org.springframework.boot", name: "spring-boot", version: "2.1.0.RELEASE"
implementation group: "org.springframework.boot", name: "spring-boot-starter-web", version: "2.1.0.RELEASE"
implementation group: "org.springframework", name: "spring-websocket", version: "5.1.2.RELEASE"
}

compileKotlin {
kotlinOptions.jvmTarget = "1.8"
}

最佳答案

编辑

看起来这是一个编码问题。 Java 的 file.encoding 系统属性在从 Boot 外部运行时设置为 UTF-8,但在 Boot 中设置为 windows-31j。将 result?.string 切换为 result?.getString("UTF-8") 修复了它。


我将把这归因于 Bytedeco 的 Tesseract 包装器的错误。我用 tess4j 做了等效测试,没有问题:

val imageFile = File("src/main/resources/image.png")
val tess = Tesseract()
tess.setPageSegMode(PSM_SINGLE_BLOCK_VERT_TEXT)
tess.setLanguage("jpn_vert")
System.out.println("Parsed text:\n" + tess.doOCR(imageFile))

给我:

坊っちゃん
夏目 滞 石

正如预期的那样。

我已经提交了 ticket on their github ,所以希望不久之后就能解决这个问题。

关于spring-boot - Spring Boot 应用程序中的 Tesseract 为日语提供了无意义的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53576486/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com