概述:多种方式实现对图片的ocr识别,识别可用于验证码,图片文字识别等
-
使用Tess4J识别验证码
- 目前这个工具精度不是很高,但是他可以自己训练模型,提升精度,这里只记录使用方法,我试了两种不太复杂的,都识别错误,如果不是很简单的图,这个需要再训练或者找其他工具
- 工具下载地址:https://sourceforge.net/projects/tess4j/
(1)下载后进行解压,将Tess4J-3.4.8-src\Tess4J\lib和Tess4J-3.4.8-src\Tess4J\dist下的jar包都拷贝到apache-jmeter-5.5\lib路径下,然后重启jmeter
(2)将图片或者验证码保存至本地
(3)使用工具进行识别因为我的验证码接口返回的验证码是base加密后的字符串,所以在保存之前需要先解密,然后保存为图片
使用的代码如下:
import org.apache.commons.codec.binary.Base64; import java.io.*; import net.sourceforge.tess4j.*; Base64 base64=new Base64(); byte[] data=base64.decode("${image}"); String file_name = "D://code.png"; //代表存放文件的位置和文件名,路径和文件名需要自定义,路径需要提前创建 File file = new File(file_name); FileOutputStream out = new FileOutputStream(file); out.write(data); out.close(); vars.put("file_name",file_name); File imageFile1 = new File(file_name);//读取图片数字 Tesseract instance = new Tesseract(); instance.setDatapath("D://Tools//ocr//Tess4J-3.4.8-src//Tess4J//tessdata"); //Tess4j 文件里的 tessdata 目录下 instance.setLanguage("eng");//英文库识别数字比较准确 content = instance.doOCR(imageFile1).replace("\n", ""); vars.put("aaaaaa",content);
-
使用OcrServer进行识别
- 这个工具识别我这个验证码会报错,猜测是验证码复杂,转字节后太长导致服务器响应出错
- 获取方式:
(1)下载工具后,运行exe文件,会起一个本地127.0.0.1的http服务,端口为12349
(2) 如果你的验证码返回直接为图片base64加密后内容,那么直接把这个内容给ocr工具进行识别使用json提取出返回值中,图片base64的部分
然后添加一个HTTP请求
加一个察看结果树,运行,查看结果,识别验证码的请求和响应如下,已经报错,目前未解
(3) 如果你的验证码返回直接是图片,那么需要对图片加密base64后,进行识别
- 在获取验证码的请求后面,添加一个保存图片的监听器:保存响应到文件
- 然后在添加一个 取样器:JSR223 Sampler,对图片进行base64编码
使用的代码如下:
SampleResult.setIgnore(); import java.io.*; import org.apache.commons.codec.binary.Base64; String image=vars.get("png"); log.info("开始打印:image"); log.info(image); byte[] data = null; try { InputStream in = new FileInputStream(image); data = new byte[in.available()]; in.read(data); in.close(); } catch (IOException e) { e.printStackTrace(); } Base64 base64=new Base64(); vars.put("base64",base64.encodeToString(data));
- 最后添加一个HTTP请求,把加密好的数据发给ocr识别
- 添加一个察看结果树、调试取样器进行结果观察