使用Tesseract实现验证码图片内容识别

Tesseract为OCR中最为流行的开源软件,本文仅演示了使用Tesseract识别验证码图片的应用场景,其他使用场景需要自行解锁

简介

本人学习环境:

        操作系统:Mac

        java版本:jdk11

        (仅作为环境介绍,不一致也无妨)

可应用场景网站示例

测试验证码图片

开发步骤

步骤一:安装Tesseract环境

可去官网查看各个环境的安装教程,本次是使用的Mac版本,windows安装地址

此步骤自行操作

步骤二:添加相关Maven依赖

    <!--<tess4j图片识别>-->
    <dependency>
      <groupId>org.bytedeco.javacpp-presets</groupId>
      <artifactId>tesseract-platform</artifactId>
      <version>4.0.0-1.4.4</version>
    </dependency>

步骤三:java方法代码

/*
       OCR识别-提取计算
    */
    public String ocrQdTown(String savePath, String imageName, String tesseractDataPath) throws Exception{
        log.info("OCR识别-提取计算,开始!" );
        try {
            BytePointer outText;

            tesseract.TessBaseAPI api = new tesseract.TessBaseAPI();
            //s指定安装好的tessdata目录路径,s1指定语言
            //chi_sim为简体中文(需要在安装tessdata过程中手动指定安装chi_sim语言),eng为英文(为默认安装语言)
            if (api.Init(tesseractDataPath, "eng_new") != 0) {
                System.err.println("无法初始化tesseract");
                return null;
            }
            // 放入图片
            lept.PIX image = lept.pixRead(savePath+"/"+imageName);
            api.SetImage(image);
            // 获取OCR结果
            outText = api.GetUTF8Text();

            // 文本识别
            String ocrCodeStr = outText.getString();
            log.info("OCR解析前:"+ocrCodeStr);
            String verificationCode = ocrExtCodeQdTown(ocrCodeStr);
            log.info("OCR解析后:"+verificationCode);

            // 销毁使用过的对象并释放内存
            api.End();
            api.close();
            outText.deallocate();
            lept.pixDestroy(image);

            return verificationCode;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

验证码提取处理

/*
        解析提取验证码
     */
    public String ocrExtCodeQdTown(String ocrCodeStr){
        try {
            ocrCodeStr = ocrCodeStr.replaceAll("[^(0-9+-.)]", "");
            if(ocrCodeStr.length()!=3){
                return null;
            }
            if(ocrCodeStr.contains("+")){
                Integer ocrCodeInt = Integer.valueOf(ocrCodeStr.split("\\+")[0])+Integer.valueOf(ocrCodeStr.split("\\+")[1]);
                ocrCodeStr = ocrCodeInt+"";
            }else if(ocrCodeStr.contains("-")){
                ocrCodeStr = ocrCodeStr.replaceAll("=","");
                Integer ocrCodeInt = Integer.valueOf(ocrCodeStr.split("\\-")[0])-Integer.valueOf(ocrCodeStr.split("\\-")[1]);
                ocrCodeStr = ocrCodeInt+"";
            }else if(ocrCodeStr.contains(".")){
                ocrCodeStr = ocrCodeStr.replaceAll("=","");
                Integer ocrCodeInt = Integer.valueOf(ocrCodeStr.split("\\.")[0])-Integer.valueOf(ocrCodeStr.split("\\.")[1]);
                ocrCodeStr = ocrCodeInt+"";
            }else{
                return null;
            }
            return ocrCodeStr.trim();
        }catch (Exception e){
            return null;
        }
    }

步骤四:测试启动调用

 public static void main(String[] args) {
        try {
            String verificationCode = new OcrBiz().ocrQdTown("图片实际路径","imgInit.png","tessdata路径");
            System.out.println(verificationCode);
        }catch (Exception e){

        }

    }

步骤四:测试结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值