• JAVA使用Tess4J进行ocr识别


    Tess4J是对Tesseract OCR API.的Java JNA 封装。使java能够通过调用Tess4J的API来使用Tesseract OCR。支持的格式:TIFF,JPEG,GIF,PNG,BMP,JPEG,and PDF
    Tesseract 的github地址:https://github.com/tesseract-ocr/tesseract
    Tess4J的github地址:https://github.com/nguyenq/tess4j

    Tess4J API 提供的功能:
    1、直接识别支持的文件
    2、识别图片流
    3、识别图片的某块区域
    4、将识别结果保存为 TEXT/ HOCR/ PDF/ UNLV/ BOX
    5、通过设置取词的等级,提取识别出来的文字
    6、获得每一个识别区域的具体坐标范围
    7、调整倾斜的图片
    8、裁剪图片
    9、调整图片分辨率
    10、从粘贴板获得图像
    11、克隆一个图像(目的:创建一份一模一样的图片,与原图在操作修改上,不相 互影响)
    12、图片转换为二进制、黑白图像、灰度图像
    13、反转图片颜色
    demo.java:

        /**
         * Test of doOCR method, of class Tesseract.
         * 根据图片文件进行识别
         * @throws Exception while processing image.
         */
        @Test
        public void testDoOCR_File() throws Exception {
            logger.info("doOCR on a jpg image");
            File imageFile = new File(this.testResourcesDataPath, "ocr.png");
            //set language
            instance.setDatapath(testResourcesLanguagePath);
            instance.setLanguage("chi_sim");
            String result = instance.doOCR(imageFile);
            logger.info(result);
        }
    
        /**
         * Test of doOCR method, of class Tesseract.
         * 根据图片流进行识别
         * @throws Exception while processing image.
         */
        @Test
        public void testDoOCR_BufferedImage() throws Exception {
            logger.info("doOCR on a buffered image of a PNG");
            File imageFile = new File(this.testResourcesDataPath, "ocr.png");
            BufferedImage bi = ImageIO.read(imageFile);
    
            //set language
            instance.setDatapath(testResourcesLanguagePath);
            instance.setLanguage("chi_sim");
    
            String result = instance.doOCR(bi);
            logger.info(result);
        }
    
        /**
         * Test of getSegmentedRegions method, of class Tesseract.
         * 得到每一个划分区域的具体坐标
         * @throws java.lang.Exception
         */
        @Test
        public void testGetSegmentedRegions() throws Exception {
            logger.info("getSegmentedRegions at given TessPageIteratorLevel");
            File imageFile = new File(testResourcesDataPath, "ocr.png");
            BufferedImage bi = ImageIO.read(imageFile);
            int level = TessPageIteratorLevel.RIL_SYMBOL;
            logger.info("PageIteratorLevel: " + Utils.getConstantName(level, TessPageIteratorLevel.class));
            List<Rectangle> result = instance.getSegmentedRegions(bi, level);
            for (int i = 0; i < result.size(); i++) {
                Rectangle rect = result.get(i);
                logger.info(String.format("Box[%d]: x=%d, y=%d, w=%d, h=%d", i, rect.x, rect.y, rect.width, rect.height));
            }
    
            assertTrue(result.size() > 0);
        }
    
    
        /**
         * Test of doOCR method, of class Tesseract.
         * 根据定义坐标范围进行识别
         * @throws Exception while processing image.
         */
        @Test
        public void testDoOCR_File_Rectangle() throws Exception {
            logger.info("doOCR on a BMP image with bounding rectangle");
            File imageFile = new File(this.testResourcesDataPath, "ocr.png");
            //设置语言库
            instance.setDatapath(testResourcesLanguagePath);
            instance.setLanguage("chi_sim");
            //划定区域
            // x,y是以左上角为原点,width和height是以xy为基础
            Rectangle rect = new Rectangle(84, 21, 15, 13);
            String result = instance.doOCR(imageFile, rect);
            logger.info(result);
        }
    
        /**
         * Test of createDocuments method, of class Tesseract.
         * 存储结果
         * @throws java.lang.Exception
         */
        @Test
        public void testCreateDocuments() throws Exception {
            logger.info("createDocuments for png");
            File imageFile = new File(this.testResourcesDataPath, "ocr.png");
            String outputbase = "target/test-classes/docrenderer-2";
            List<RenderedFormat> formats = new ArrayList<RenderedFormat>(Arrays.asList(RenderedFormat.HOCR, RenderedFormat.TEXT));
    
            //设置语言库
            instance.setDatapath(testResourcesLanguagePath);
            instance.setLanguage("chi_sim");
    
            instance.createDocuments(new String[]{imageFile.getPath()}, new String[]{outputbase}, formats);
        }
    
        /**
         * Test of getWords method, of class Tesseract.
         * 取词方法
         * @throws java.lang.Exception
         */
        @Test
        public void testGetWords() throws Exception {
            logger.info("getWords");
            File imageFile = new File(this.testResourcesDataPath, "ocr.png");
    
            //设置语言库
            instance.setDatapath(testResourcesLanguagePath);
            instance.setLanguage("chi_sim");
    
            //按照每个字取词
            int pageIteratorLevel = TessPageIteratorLevel.RIL_SYMBOL;
            logger.info("PageIteratorLevel: " + Utils.getConstantName(pageIteratorLevel, TessPageIteratorLevel.class));
            BufferedImage bi = ImageIO.read(imageFile);
            List<Word> result = instance.getWords(bi, pageIteratorLevel);
    
            //print the complete result
            for (Word word : result) {
                logger.info(word.toString());
            }
        }
    
        /**
         * Test of Invalid memory access.
         * 处理倾斜
         * @throws Exception while processing image.
         */
        @Test
        public void testDoOCR_SkewedImage() throws Exception {
            //设置语言库
            instance.setDatapath(testResourcesLanguagePath);
            instance.setLanguage("chi_sim");
    
            logger.info("doOCR on a skewed PNG image");
            File imageFile = new File(this.testResourcesDataPath, "ocr_skewed.jpg");
            BufferedImage bi = ImageIO.read(imageFile);
            ImageDeskew id = new ImageDeskew(bi);
            double imageSkewAngle = id.getSkewAngle(); // determine skew angle
            if ((imageSkewAngle > MINIMUM_DESKEW_THRESHOLD || imageSkewAngle < -(MINIMUM_DESKEW_THRESHOLD))) {
                bi = ImageHelper.rotateImage(bi, -imageSkewAngle); // deskew image
            }
    
            String result = instance.doOCR(bi);
            logger.info(result);
        }
    
    

    Tess4JDemo码云地址:https://gitee.com/zhaohuihbwj/Tess4JDemo

    Java OCR文字识别(Tess4J)

           OCR (Optical Character Recognition,光学字符识别)是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗、亮的模式确定其形状,然后用字符识别方法将形状翻译成计算机文字的过程;即,针对印刷体字符,采用光学的方式将纸质文档中的文字转换成为黑白点阵的图像文件,并通过识别软件将图像中的文字转换成文本格式,供文字处理软件进一步编辑加工的技术。如何除错或利用辅助信息提高识别正确率,是OCR最重要的课题,ICR(Intelligent Character Recognition)的名词也因此而产生。衡量一个OCR系统性能好坏的主要指标有:拒识率、误识率、识别速度、用户界面的友好性,产品的稳定性,易用性及可行性等。

           Tess4J是对google tesseract ocr的java库的一种实现

    1.maven添加依赖

    <!-- https://mvnrepository.com/artifact/net.sourceforge.tess4j/tess4j -->
    <dependency>
        <groupId>net.sourceforge.tess4j</groupId>
        <artifactId>tess4j</artifactId>
        <version>3.2.1</version>
    </dependency>
    2.工具类编辑
    /**
     * tesseract for javaocrOptical Character Recognition,光学字符识别)
    * 工具类
    * @author wind
     */
    public class Tess4jUtils {
        /**
         * 从图片中提取文字,默认设置英文字库,使用classpath目录下的训练库
    * @param path
    * @return
    */
    public static String readChar(String path){
            // JNA Interface Mapping
            ITesseract instance = new Tesseract();
            // JNA Direct Mapping
            // ITesseract instance = new Tesseract1();
            File imageFile = new File(path);
            //In case you don't have your own tessdata, let it also be extracted for you
            //这样就能使用classpath目录下的训练库了
            File tessDataFolder = LoadLibs.extractTessResources("tessdata");
            //Set the tessdata path
            instance.setDatapath(tessDataFolder.getAbsolutePath());
            //英文库识别数字比较准确
            instance.setLanguage(Const.ENG);
            return getOCRText(instance, imageFile);
        }
    
        /**
         * 从图片中提取文字
    * @param path 图片路径
    * @param dataPath 训练库路径
    * @param language 语言字库
    * @return
    */
    public static String readChar(String path, String dataPath, String language){
            File imageFile = new File(path);
            ITesseract instance = new Tesseract();
            instance.setDatapath(dataPath);
            //英文库识别数字比较准确
            instance.setLanguage(language);
            return getOCRText(instance, imageFile);
        }
    
        /**
         * 识别图片文件中的文字
    * @param instance
    * @param imageFile
    * @return
    */
    private static String getOCRText(ITesseract instance, File imageFile){
            String result = null;
            try {
                result = instance.doOCR(imageFile);
            } catch (TesseractException e) {
                e.printStackTrace();
            }
            return result;
        }
    
        public static void main(String[] args) {
            /*String path = "src/main/resources/image/text.png";
            System.out.println(readChar(path));*/
    
            String ch = "src/main/resources/image/ch.png";
            System.out.println(readChar(ch, "src/main/resources", Const.CHI_SIM));
        }
    
    }
    注释:中文结果不够准确,需要自己训练字库
    具体训练字库,以及完整代码请移步https://github.com/followwwind/javautils
  • 相关阅读:
    如何提高使用Java反射的效率?
    程序猿必知必会Linux命令之awk
    Java日志正确使用姿势
    “==”、“equals()”、“hashcode()”之间的秘密
    Mybatis缓存
    Java高并发至Synchronized
    web.py
    python爬虫模块理解
    通用http状态码
    SpringMVC的理论
  • 原文地址:https://www.cnblogs.com/pejsidney/p/9487881.html
Copyright © 2020-2023  润新知