使用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
    评论
以下是一个基于Python的模拟登录教务系统并使用tesseract完成文字验证码自动识别的代码实现。请注意,这只是一个简单的示例,具体实现时需要根据目标教务系统的具体情况进行调整。 ```python import requests from PIL import Image import pytesseract from bs4 import BeautifulSoup # 目标教务系统登录接口 login_url = 'http://xxx.xxx.xxx.xxx/login' # 创建session对象 session = requests.session() # 获取验证码图片并保存到本地 captcha_url = 'http://xxx.xxx.xxx.xxx/captcha' captcha_img = session.get(captcha_url).content with open('captcha.png', 'wb') as f: f.write(captcha_img) # 使用tesseract识别验证码 captcha_text = pytesseract.image_to_string(Image.open('captcha.png')) # 构造登录请求参数 data = { 'username': 'your_username', 'password': 'your_password', 'captcha': captcha_text } # 发送登录请求 response = session.post(login_url, data=data) # 解析登录后的页面 soup = BeautifulSoup(response.content, 'html.parser') # 获取需要的信息 info = soup.find('div', {'class': 'info'}).text print(info) ``` 在上述代码中,我们使用了requests库创建了一个session对象,这样可以保持会话状态,避免每次请求都需要重新登录。然后我们发送了一个GET请求获取验证码图片,并使用Pillow库将其保存到本地。接着,我们使用tesseract库对图片进行识别,并将识别结果作为参数构造了登录请求。最后,我们使用BeautifulSoup库解析了登录后的页面,获取需要的信息。 需要注意的是,由于验证码识别率可能会受到多种因素的影响,因此需要进行一定的实验和调整,才能达到较好的效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值