龙空技术网

Java之Tesseract实现OCR

未秃的码仔 1022

前言:

而今咱们对“tesseract算法”大致比较关注,朋友们都需要知道一些“tesseract算法”的相关知识。那么小编同时在网络上收集了一些对于“tesseract算法””的相关文章,希望同学们能喜欢,姐妹们快快来了解一下吧!

背景:本人是java开发,但是一直有着一颗算法开发的心,所以不断充实自己的,现在就分享给大家吧

知识点:Tesseract,一款由HP实验室开发由Google维护的开源OCR(Optical Character Recognition , 光学字符识别)库,目前由谷歌赞助,它可以通过训练识别出任何字体,我们可以不断的训练的库,使图像转换文本的能力不断增强,github地址:

1、直接看做实验demo代码,可以拿去直接用的

package com.vue.demo.service.serviceimpl;import com.vue.demo.service.OCRService;import net.sourceforge.tess4j.Tesseract;import net.sourceforge.tess4j.TesseractException;import net.sourceforge.tess4j.util.ImageHelper;import org.apache.commons.io.FileUtils;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.stereotype.Service;import org.springframework.web.multipart.MultipartFile;import javax.imageio.ImageIO;import java.awt.image.BufferedImage;import java.io.File;import java.io.IOException;/** * @author yangwj * @date 2020/4/1 9:29 */@Servicepublic class OCRServiceImpl implements OCRService {    private  static  final Logger ocrServiceImplLog = LoggerFactory.getLogger(OCRServiceImpl.class);    String language = "";    /**     * 方法一     * @param file     * @return     */    @Override    public String getCharacterFromPic(MultipartFile file) {//        String modelPath = "D:\\software\\ocr-tesseract\\tessdata";        String modelPath = "/root/project/java/tesseract_model";        Tesseract tessreact = new Tesseract();        //需要指定训练集 训练集到  下载。        tessreact.setDatapath(modelPath);        if(language.equals("ch")) {            //注意  默认是英文识别,如果做中文识别,需要单独设置。            tessreact.setLanguage("chi_sim");        }        try {            File imageFile = new File(file.getOriginalFilename());            FileUtils.copyInputStreamToFile(file.getInputStream(), imageFile);            String result = tessreact.doOCR(imageFile);            ocrServiceImplLog.info(result);            System.out.println("----------------");            String handleResult  =  this.ocr(imageFile,modelPath);            ocrServiceImplLog.info(handleResult);            return result+"----------------------------------\n\r"+handleResult;        } catch (TesseractException e) {            System.err.println(e.getMessage());        } catch (IOException e) {            e.printStackTrace();        }        return null;    }    @Override    public String getLanguage(String language) {        if(language == null || language == "" ) {            return null;        }        this.language = language;        return "success";    }    /**     * 方法二     * @param file     * @param modelPath     * @return     */    private  String ocr(File file,String modelPath) {        String result = null;        try {            double start = System.currentTimeMillis();            BufferedImage textImage = ImageIO.read(file);            // 这里对图片黑白处理,增强识别率.这里先通过截图,截取图片中需要识别的部分            textImage = ImageHelper.convertImageToGrayscale(textImage);            // 图片锐化            textImage = ImageHelper.convertImageToBinary(textImage);            // 图片放大倍数,增强识别率(很多图片本身无法识别,放大5倍时就可以轻易识,但是考滤到客户电脑配置低,针式打印机打印不连贯的问题,这里就放大5倍)            textImage = ImageHelper.getScaledInstance(textImage, textImage.getWidth() * 1, textImage.getHeight() * 1);            textImage = ImageHelper.convertImageToBinary(textImage);            String saveImgPath = "/root/project/java/tesseract_model/temp_img";//            String saveImgPath = "D:\\software\\ocr-tesseract\\img_tem\\temp.img";            ImageIO.write(textImage, "png", new File(saveImgPath));            Tesseract instance = new Tesseract();            //设置训练库的位置//            String modelPath = "/root/project/java/tesseract_model";            instance.setDatapath(modelPath);            //中文识别            instance.setLanguage("chi_sim");            result = instance.doOCR(textImage);            double end = System.currentTimeMillis();            System.out.println("耗时" + (end - start) / 1000 + " s");        } catch (Exception e) {            e.printStackTrace();        }        return result;    }}

方法一和方法二都可以使用,不过本人测试发现,方法一更加准确点

2、代码测试结果

待检测的图像

postman测试结果

总体而言,识别率还是挺高的

不会用请留言,留言必回复

点赞+转发 ,后续给你们看我部署在腾讯云上过程

标签: #tesseract算法 #java实现ocr文字识别 #tesseract算法描述