【JAVA】Tesseract-OCR截图屏幕指定区域识别0.4.2

【JAVA】Tesseract-OCR截图屏幕指定区域识别0.2.2

    • 步骤
      • [1. Tesseract-OCR下载地址](#1. Tesseract-OCR下载地址)
      • [2. 添加maven依赖](#2. 添加maven依赖)
      • [3. 下载中文语言包](#3. 下载中文语言包)
      • [4. 正式代码](#4. 正式代码)

2024年12月20日19:53:57----0.2.2

2024年12月23日11:59:16----0.3.2

步骤

1. Tesseract-OCR下载地址

https://tesseract-ocr.github.io/tessdoc/Downloads.html

2. 添加maven依赖

java 复制代码
    <dependencies>
        <dependency>
            <groupId>net.sourceforge.tess4j</groupId>
            <artifactId>tess4j</artifactId>
            <version>4.5.4</version>
        </dependency>
    </dependencies>

3. 下载中文语言包

https://gitcode.com/open-source-toolkit/99b98/blob/main/tessdata.rar

下载后将rar解压放到类似这样的目录D:\Program Files\Tesseract-OCR\tessdata

如果没有该语言包,但是代码里有instance.setLanguage("chi_sim"),就会报错

java 复制代码
      * Warning: Invalid resolution 0 dpi. Using 70 instead.
      * Exception in thread "main" java.lang.Error: Invalid memory access
      * 	at com.sun.jna.Native.invokePointer(Native Method)
      * 	at com.sun.jna.Function.invokePointer(Function.java:497)
      * 	at com.sun.jna.Function.invoke(Function.java:441)
      * 	at com.sun.jna.Function.invoke(Function.java:361)
      * 	at com.sun.jna.Library$Handler.invoke(Library.java:265)
      * 	at com.sun.proxy.$Proxy0.TessBaseAPIGetUTF8Text(Unknown Source)
      * 	at net.sourceforge.tess4j.Tesseract.getOCRText(Tesseract.java:517)
      * 	at net.sourceforge.tess4j.Tesseract.doOCR(Tesseract.java:359)
      * 	at net.sourceforge.tess4j.Tesseract.doOCR(Tesseract.java:228)
      * 	at net.sourceforge.tess4j.Tesseract.doOCR(Tesseract.java:195)
      * 	at Main.main(Main.java:23)

4. 正式代码

下面这个代码就是从指定区域识别字符,然后从字符里找出数字

java 复制代码
import net.sourceforge.tess4j.ITesseract;
import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.TesseractException;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        clipPic();
        System.out.println(getFinalNumber());
    }

    public static String findNumber(String input){
        String findResult="";
        // 定义正则表达式模式,用于匹配数字
        Pattern pattern = Pattern.compile("\\d+");
        // 创建Matcher对象,用于对输入字符串进行匹配操作
        Matcher matcher = pattern.matcher(input);
        // 通过循环查找并输出所有匹配的数字
        while (matcher.find()) {
            findResult=matcher.group();
        }
        return findResult;
    }

    public static void clipPic(){
        try {
            // 创建一个Robot对象
            Robot robot = new Robot();
            // 指定截图区域
            Rectangle screenRect = new Rectangle(1920, 0, 150, 43); // x, y, width, height
            // 截图
            BufferedImage screenFullImage = robot.createScreenCapture(screenRect);
            // 保存图片
            ImageIO.write(screenFullImage, "png", new File("D:\\日志\\123.png"));
            System.out.println("截图已保存为 screenshot.png");
        } catch (AWTException | IOException ex) {
            System.err.println("截图失败:" + ex);
        }
    }

    public static String getFinalNumber(){
        String finalResult="";
        // 初始化Tesseract实例
        ITesseract instance = new Tesseract();

        try {
            // 设置Tesseract的语言库路径(根据实际情况修改)
            instance.setDatapath("D:\\Program Files\\Tesseract-OCR\\tessdata");
            // 设置识别语言,默认为英文,中文简体设置为"chi_sim"
            instance.setLanguage("chi_sim");
            
            // 设置tessedit_unrej_any_wd参数,示例设为true,允许识别任何未被拒绝的单词
            instance.setTessVariable("tessedit_unrej_any_wd", "true");
            // 设置textord_force_make_prop_words参数,强制创建合理的单词,有助于中文词汇组合识别
            instance.setTessVariable("textord_force_make_prop_words", "true");
            // 设置tessedit_create_hocr参数,生成hOCR格式输出,利于文本位置和排版相关分析
            instance.setTessVariable("tessedit_create_hocr", "true");
            // 设置language_model_ngram_score参数,这里设置一个示例值,需根据实际测试调整
            instance.setTessVariable("language_model_ngram_score", "0.6");
            
            // 读取待识别的图片文件
            File imageFile = new File("D:\\日志\\123.png");
            // 执行OCR识别
            finalResult = findNumber(instance.doOCR(imageFile));
            return finalResult;
        } catch (TesseractException e) {
            System.err.println(e.getMessage());
        }
        return finalResult;
    }
}
相关推荐
苹果醋32 分钟前
2020重新出发,MySql基础,MySql表数据操作
java·运维·spring boot·mysql·nginx
小蜗牛慢慢爬行4 分钟前
如何在 Spring Boot 微服务中设置和管理多个数据库
java·数据库·spring boot·后端·微服务·架构·hibernate
azhou的代码园7 分钟前
基于JAVA+SpringBoot+Vue的制造装备物联及生产管理ERP系统
java·spring boot·制造
ONE米球兔11 分钟前
OCR(四)windows 环境基于c++的 paddle ocr 编译【GPU版本】
ocr·paddle
波音彬要多做15 分钟前
41 stack类与queue类
开发语言·数据结构·c++·学习·算法
Swift社区23 分钟前
Excel 列名称转换问题 Swift 解答
开发语言·excel·swift
一道微光27 分钟前
Mac的M2芯片运行lightgbm报错,其他python包可用,x86_x64架构运行
开发语言·python·macos
矛取矛求31 分钟前
QT的前景与互联网岗位发展
开发语言·qt
Leventure_轩先生31 分钟前
[WASAPI]从Qt MultipleMedia来看WASAPI
开发语言·qt
向宇it1 小时前
【从零开始入门unity游戏开发之——unity篇01】unity6基础入门开篇——游戏引擎是什么、主流的游戏引擎、为什么选择Unity
开发语言·unity·c#·游戏引擎