什么都不必说--简单图片金额识别OCR

需求 获取图片中金额
复制代码

1.添加maven

  <!--图片识别-->
        <dependency>
            <groupId>net.sourceforge.tess4j</groupId>
            <artifactId>tess4j</artifactId>
            <version>2.0.1</version>
            <exclusions>
                <exclusion>
                    <groupId>com.sun.jna</groupId>
                    <artifactId>jna</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
复制代码

2.安装tessdata

brew install tesseract 
复制代码

3.工具类

public class OCRUtil {
    private static String  tessdataPath;
    private static String STRING_TESS_VARIABLE_KEY = "tessedit_char_whitelist";
    private static String STRING_TESS_VARIABLE_VALUE = "0123456789.¥";
    private static String STRING_TESS_NAME = "tessdata";

    private ITesseract instance;

    private static OCRUtil ocrUtil;

    private OCRUtil(ITesseract instance){
        this.instance = instance;
    }

    private static final LogUtil logUtil  = LogUtil.init(OCRUtil.class);

    //必须加锁,在高并发情况下会出现jvm崩坏情况
    public  synchronized String getAmount(BufferedImage bi) throws IOException {
        long start = System.currentTimeMillis();
        try {

            String ocrResult = instance.doOCR(bi);
            if(StringUtil.isEmpty(ocrResult)){
                return null;
            }
            if(ocrResult.indexOf("¥") == -1){
                return null;
            }
            logUtil.i("金额识别 为:%s\n金额识别耗时:%s毫秒",ocrResult,System.currentTimeMillis()-start);
            return ocrResult.replace("\n","").substring(ocrResult.indexOf("¥") + 1).trim();
        } catch (TesseractException e) {
            System.err.println(e.getMessage());
        }
        return null;
    }

    public static synchronized OCRUtil init(){

        if(null == ocrUtil){
            ITesseract instance = new Tesseract(); // JNA Direct Mapping
            instance.setTessVariable(STRING_TESS_VARIABLE_KEY, STRING_TESS_VARIABLE_VALUE);
//            File tessDataFolder = LoadLibs.extractTessResources(STRING_TESS_NAME);
//            logUtil.d(tessDataFolder.getAbsolutePath());
            //从外部获取tessdataPath或者查询tessdata所在位置
            instance.setDatapath(tessdataPath);
            ocrUtil = new OCRUtil(instance);
        }

        return ocrUtil;

    }

}

复制代码

转载于:https://juejin.im/post/5b39d1bb6fb9a00e43467df9

<think>好的,我现在需要帮助用户使用Tesseract-OCR识别和提取发票上的信息。首先,我得回忆一下Tesseract的基本使用步骤,并结合用户提供的引用内容来优化流程。 根据引用3和引用5,用户提到了预处理的重要性,比如二值化、去噪等。发票通常有复杂的背景和表格,直接识别可能效果不好,所以预处理是关键。我需要先建议用户安装Tesseract和必要的库,比如pytesseract和OpenCV。 然后,用户可能需要安装语言包,比如中文支持。引用1提到Tesseract支持多语言,但需要额外安装。所以安装步骤里应该包括下载chi_sim语言包。 接下来是代码部分。需要读取图片,用OpenCV进行灰度化、二值化、降噪等处理。例如,高斯模糊和阈值处理可以提高识别率。然后调用pytesseract.image_to_string进行处理,并指定中文语言。 用户可能遇到识别不准确的问题,引用3中提到训练特定数据集的方法,但这对新手可能复杂。或许可以建议使用现有的训练数据或调整参数,比如PSM模式,选择适合发票布局的模式,比如PSM_AUTO(3)或PSM_SPARSE(11)。 另外,引用2和引用4提到了二值化处理和使用示例图片测试,所以在代码示例中加入这些步骤是必要的。同时,引用5指出商业算法可能更好,但Tesseract是开源替代方案,可能需要调整参数和多次尝试。 最后,用户可能需要进一步优化,比如定位特定区域(如金额、日期),这需要用到OpenCV的ROI提取。此外,训练自定义模型可能是一个高级步骤,但用户如果是初学者,可能需要更简单的建议,比如调整预处理参数或使用更高分辨率的图片。 总结步骤:安装→预处理→识别→优化。同时,提供常见问题解决,如调整PSM,使用ROI,训练模型等。确保代码示例清晰,并解释每个步骤的作用,让用户能够逐步实施。</think>### 分步解决方案:使用Tesseract-OCR识别发票信息 #### 1. 环境准备 - **安装Tesseract-OCR** 下载并安装对应操作系统的[Tesseract-OCR](https://github.com/tesseract-ocr/tesseract)可执行文件[^1]。 ```bash # Ubuntu示例 sudo apt install tesseract-ocr sudo apt install libtesseract-dev ``` - **安装Python依赖库** ```bash pip install pytesseract opencv-python ``` #### 2. 图像预处理(关键步骤) 发票图像常存在背景干扰、倾斜、低对比度等问题,需通过OpenCV优化: ```python import cv2 import pytesseract # 读取图像 image = cv2.imread("invoice.jpg") # 灰度化 + 降噪 gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) blur = cv2.GaussianBlur(gray, (3,3), 0) # 二值化(增强文字对比度) _, thresh = cv2.threshold(blur, 150, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) # 保存预处理后的图像供调试 cv2.imwrite("processed_invoice.jpg", thresh) ``` #### 3. 配置Tesseract参数 ```python # 设置Tesseract路径(Windows需指定安装路径) pytesseract.pytesseract.tesseract_cmd = r'/usr/bin/tesseract' # 识别中文内容(需下载chi_sim训练数据) custom_config = r'--oem 3 --psm 6 -l chi_sim+eng' text = pytesseract.image_to_string(thresh, config=custom_config) # 输出结果 print("识别结果:\n", text) ``` #### 4. 关键优化技巧 - **区域定位(ROI)** 若需提取特定字段(如金额、发票代码),通过OpenCV定位文本区域: ```python # 示例:截取金额区域 x, y, w, h = 200, 400, 300, 100 # 坐标需根据实际图像调整 roi = thresh[y:y+h, x:x+w] cv2.imshow("ROI", roi) amount = pytesseract.image_to_string(roi, config=custom_config) ``` - **PSM模式调整** 根据文本布局选择`--psm`参数(如`--psm 11`适用于稀疏文本)[^3]。 - **自定义训练** 针对特殊字体/格式,使用[Tesseract训练工具](https://github.com/tesseract-ocr/tesstrain)生成专属模型[^1]。 #### 5. 常见问题解决 - **识别乱码**:检查语言包是否安装(`chi_sim.traineddata`需放置在`tessdata`目录) - **倾斜校正**:使用OpenCV的`getRotationMatrix2D`进行旋转矫正 - **表格识别**:结合OpenCV轮廓检测分割单元格后逐格识别
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值