tesseract下载链接:
github:https://github.com/tesseract-ocr/
db:https://digi.bib.uni-mannheim.de/tesseract/
文字识别技术在许多领域都有广泛的应用,例如文档处理、自动化办公、移动设备上的文本输入等。而Tesseract-OCR作为一款开源的OCR引擎,以其高效、准确的文字识别能力,受到了广泛的关注和应用。本文将详细介绍Tesseract-OCR的原理、优势、使用方法以及应用案例,帮助读者更好地理解和使用这款工具。
一、Tesseract-OCR简介
Tesseract-OCR是由HP实验室开发,后由Google维护的一款开源OCR引擎。OCR是Optical Character Recognition的缩写,意为光学字符识别,是一种通过计算机软件识别印刷或手写文本的技术。Tesseract-OCR采用深度学习的方法进行文字识别,可以识别多种语言,包括英文、中文、德文、法文等。
二、Tesseract-OCR的优势
- 准确性高:Tesseract-OCR的准确性在同类产品中处于领先地位,对于印刷体文本的识别率高达95%以上。
- 支持多种语言:Tesseract-OCR支持多种语言的识别,包括英文、中文、德文、法文等,并可以通过训练来扩展识别其他语言。
- 灵活的API接口:Tesseract-OCR提供了灵活的API接口,可以轻松集成到各种应用中,方便开发者进行二次开发。
- 跨平台性:Tesseract-OCR可以在多种操作系统上运行,如Windows、Linux和Mac OS等。
三、Tesseract-OCR的使用方法 - 安装:首先需要下载并安装Tesseract-OCR软件。可以从官网下载最新版本的安装包进行安装。对于不同的操作系统,需要选择相应的安装包进行下载和安装。
- 训练数据:为了提高识别的准确性,需要对特定的字体或文本进行训练。训练数据可以是自己的数据集,也可以使用公开的数据集进行训练。训练完成后,保存为.traineddata文件供Tesseract-OCR使用。
- API接口:Tesseract-OCR提供了多种语言的API接口,包括C++、Java、Python等。开发者可以根据自己的需求选择相应的接口进行集成和使用。使用API接口可以方便地进行文本识别的各种操作,例如识别图片中的文本、进行文本转换等。
四、Tesseract-OCR的应用案例 - PDF文字识别:将PDF文件中的文字识别出来,方便用户进行编辑和使用。
- 图形验证码识别:将图形验证码中的文字识别出来,用于登录验证等场景。
- 移动设备上的文本输入:通过拍照或扫描文档,将图片中的文字识别出来,方便用户进行文本输入。
- 自动化办公:将纸质文档或图片中的文字识别出来,进行后续的处理和分析。
三、(源码)Tesseract-OCR在Java中的应用实例
1、maven配置
<!-- https://mvnrepository.com/artifact/net.sourceforge.tess4j/tess4j --><dependency><groupId>net.sourceforge.tess4j</groupId><artifactId>tess4j</artifactId><version>4.5.5</version></dependency>
2、源码
/*** 提取图片文字接口 V1.1*/
@RestController
@RequestMapping(value="/ts/api/extract")
public class TpExtractionApiController {// Windows图片地址public final static String globalVariableImageUrl = "D:\\tesseract";// Windows tesseract 训练地址public final static String globalVariableTesseractUrl = "D:\\tesseract";/*** main*/@RequestMapping(value="/image", method=RequestMethod.POST) public TpExtraction reg(@ApiParam(value = "文件") @RequestPart(value = "multipartFile") MultipartFile multipartFile) {//TpExtraction tpExtraction = new TpExtraction();//String filename = multipartFile.getOriginalFilename();//创建tess对象ITesseract tesseract = new Tesseract();//windows 设置训练文件目录tesseract.setDatapath(globalVariableUrl+"\\tessdata");//设置训练语言tesseract.setLanguage("chi_sim");//String result = "";//try {File file = null;try {// MultipartFile 转 Filefile = convert(multipartFile,filename);// 判断是否为PNG类型boolean bl_png = isImagePng(file);// true/falseif(bl_png) {// true 不处理}else {// 判断文件格式boolean bl = isImage(file);// if(bl) {// 转换为pngfile = convertToPng(file);}else {tpExtraction.setMsg("文件格式异常,请上传.png图片格式。");return tpExtraction;}}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}result = tesseract.doOCR(file);tpExtraction.setMsg(result);} catch (TesseractException e) {// TODO Auto-generated catch blocke.printStackTrace();}return tpExtraction;}/*** MultipartFile 转 File**/public static File convert(MultipartFile file,String filename) throws IOException {// windows 图片路径File convFile = new File(globalVariableUrl+"\\"+filename);// 创建文件convFile.createNewFile();try (InputStream in = file.getInputStream();OutputStream out = new FileOutputStream(convFile)) {byte[] buffer = new byte[1024];int bytesRead;while ((bytesRead = in.read(buffer)) != -1) {out.write(buffer, 0, bytesRead);}}return convFile;}/*** 判断文件类型是否为图片类型*/public static boolean isImage(File file) {String name = file.getName().toLowerCase();return name.endsWith(".jpg") || name.endsWith(".jpeg") || name.endsWith(".png") ||name.endsWith(".gif") || name.endsWith(".bmp") || name.endsWith(".wbmp");}/*** 判断文件类型是否为PNG图片类型*/public static boolean isImagePng(File file) {String name = file.getName().toLowerCase();return name.endsWith(".png");}/*** 将图片文件转换为PNG格式*/public static File convertToPng(File file) {//File writeFile = null;//try {BufferedImage image = ImageIO.read(file);String name = file.getName().toLowerCase();String format = "png";if (name.endsWith(".jpg") || name.endsWith(".jpeg")) {format = "png";} else if (name.endsWith(".gif")) {format = "gif";} else if (name.endsWith(".bmp") || name.endsWith(".wbmp")) {format = "bmp";}writeFile = new File(file.getParent(), name.substring(0, name.lastIndexOf('.')) + ".png");ImageIO.write(image, format, writeFile);} catch (IOException e) {e.printStackTrace();}return writeFile;}}
3、应用效果
四、 总结
如果想要提高tesseract识别率对图片分块是一个非常好的方法,识别率提高巨大。