tesseract-ocr识别验证码
前言
website通常需要输入用户名、密码和验证码。本节内容基于tesseract-ocr,提供一个验证码图片内容获取的示例。
一、tesseract-ocr环境准备
1. 前往静态资源站点下载响应的软件版本
2. tesseract-orc项目地址,可查看项目详细信息
3. 本地安装软件并配置环境
软件包下载完成后,直接点击命令默认安装就行。安装完成后需要配置TESSDATA_PREFIX环境变量,这个变量是设置tesseract安装目录下tessdata的目录位置。
二、标签内容转图片(以base64为例)
1.将标签中的内容转为图片
此处要注意src源文件格式类型,分类型生成对应格式的图片,不然会出现格式问题。
/**
* 将<img src="source"/> 中的"source"内容转换为图片
* <strong>
* "source"内容基于Base64格式编码
* </strong>
*
* @param imgSource
* @return
*/
public static File imgSource2File(String imgSource) {
String source = imgSource.replace("data:image/jpg;base64,", "");
log.info("替换格式信息后的图片数据:{}", source);
File imgFile = new File("验证码图片.jpeg");
byte[] buff = DatatypeConverter.parseBase64Binary(source);
try (FileOutputStream fops = new FileOutputStream(imgFile)) {
fops.write(buff);
} catch (IOException e) {
e.printStackTrace();
}
return imgFile;
}
2.将图片中的内容使用ocr识别出来
/**
* 识别图片内容
* OCR工具对象,及初始化参照:{@linkplain TESS_OCR_INSTANCE}
*
* @param imgFile
* @return
* @throws TesseractException
*/
public static String ocr(File imgFile) throws TesseractException {
String result = TESS_OCR_INSTANCE.doOCR(imgFile);
log.info("ocr识别出的内容:{}", result);
return result;
}
3. 如果验证码为算术表达式,可以用如下方法计算
/**
* 算数表达式计算
*
* @param expression
* @return
*/
public static String cal(String expression) throws ScriptException {
return String.valueOf(SCRIPT_ENGINE.eval(expression));
}
4. rest-API图片识别接口及postman请求示例
/**
* 图片内容识别
*
* @param jpegContent
* @return
* @throws TesseractException
*/
@PostMapping("/jpeg")
public String jpegOcr(@RequestBody String jpegContent) throws TesseractException {
log.info("传入的图片内容为:{}", jpegContent);
File imgFile = OcrUtil.imgSource2File(jpegContent);
return OcrUtil.ocr(imgFile);
}
总结
通过以上步骤,可以实现网站验证码图片内容正常识别。demo全部源码请参见源码包。
demo中的maven依赖如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.tesseract.ocr.demo</groupId>
<artifactId>tesseract-ocr</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>tesseract-ocr</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.6.13</spring-boot.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--tesseract-ocr-->
<dependency>
<groupId>net.sourceforge.tess4j</groupId>
<artifactId>tess4j</artifactId>
<version>5.7.0</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
<configuration>
<mainClass>com.tesseract.ocr.demo.tesseractocr.TesseractOcrApplication</mainClass>
<skip>true</skip>
</configuration>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>