几行 Java 代码搞定图片提取文字功能

近日浏览网上一些图片提取文字的网站,觉得甚是有趣,花费半日也做了个在线图片识别程序,完成了两个技术方案的选择,一是 tesseract + Python flask的方案实现,二是 tesseract + Spring web 的技术解决方案,并简作论述,与君共勉 。
 
一、tesseract-ocr介绍ocr 含义是Optical Character Recognition,含义即视觉字符识别 。而tesseract是该领域特别优秀开源的作品 。
官方的tesseract定义:

OCR engine - libtesseract and a command line program - tesseract.
即tesseract包括一个视觉字符识别引擎libtesseract和命令行程序tesseract 。
当前最新稳定版本是4.x.x基于LSTM,源码可从找到tesseract的GitHub: tesseract.找到 。
几行 Java 代码搞定图片提取文字功能

文章插图
  1. 输入(一张图片)
  2. 有用信息提取(比如一个图片上只有一个字,那其他留白的是无用,这个字上每个色素是有效的并且相关)
  3. 找出文字/线条
  4. 字符分类集
  5. 输入与分类集对比找出最接近的
  6. 输出识别结果
 
二、安装tesseract第一步下载
下载合适的exe安装文件:
网址:
https://digi.bib.uni-mannheim.de/tesseract/,下载完成后后装即可
几行 Java 代码搞定图片提取文字功能

文章插图
第二步环境变量配置
在path变量中加入tesseract-ocr的安装路径
几行 Java 代码搞定图片提取文字功能

文章插图
第三步安装成功检测
使用tesseract指令,显示如下:
几行 Java 代码搞定图片提取文字功能

文章插图
linux环境下载安装与上述类似
几行 Java 代码搞定图片提取文字功能

文章插图
下载leptonica 和 tesseract两个包,解压安装,配置环境变量即可 。网上很容易找到该安装包 。
 
三、使用命令行1.tesseract + 图片路径 + 保存结果名 + -l 语言集
示列: tesseract 1606150081.png 1606150081 -l chi_sim
2.tesseract + 图片路径 +stdout -l +语言集
示列: tesseract D:companyruigushopspring-2stest.png stdout -l chi_sim
有了上述之后就可以完成web图片识别程序的开发啦,废话不多说,直接上代码 。
 
四、程序实现(Python)程序设计思路:
上传图片 -> 保存 ->对上传的图片执行tesseract指令->获取识别结果
只有二十多行代码就实现了,so easy,以后网上看到图片识别程序再也不会感觉神奇了吧!
# coding=utf-8from flask import Flask, requestimport osimport datetimeimport timeApp = Flask(__name__)def get_time_stamp:times = datetime.datetime.now.strftime('%Y-%m-%d %H:%M:%S')array = time.strptime(times, "%Y-%m-%d %H:%M:%S")time_stamp = int(time.mktime(array))return time_stamp@app.route('/image/extract', methods=['POST'])def pure_rec:file = request.files.get('file')ts = str(get_time_stamp)up_path = os.path.join(ts + file.filename)file.save(up_path)cmd = "tesseract "+up_path+" " + ts + " -l chi_sim"print(cmd)os.system(cmd)with open(ts+".txt", 'r+', encoding="utf-8") as f:result = f.readreturn resultif __name__ == '__main__':app.run(debug=True) 
五、程序实现(JAVA)不需要任何引入第三方jar包,搭建一个简单的 Springboot Web 项目就可以了,没有其他额外的依赖 。
Controller:
@RestControllerpublic class LiteralExtractController {@PostMapping("/image/extract")public String reg(@RequestParam("file")MultipartFile file) throws IOException {String result = "";String filename = file.getOriginalFilename;File save = new File(System.getProperty("user.dir")+"\"+filename);if (!save.exists){save.createNewFile;}file.transferTo(save);String cmd = String.format("tesseract %s stdout -l %s",System.getProperty("user.dir")+"\"+filename,"chi_sim");result = cmd(cmd);return result;}public static String cmd(String cmd) {BufferedReader br = ;try {Process p = Runtime.getRuntime.exec(cmd);br = new BufferedReader(new InputStreamReader(p.getInputStream));String line = ;StringBuilder sb = new StringBuilder;while ((line = br.readLine) != ) {sb.append(line + "n");}return sb.toString;} catch (Exception e) {e.printStackTrace;}finally{if (br != ){try {br.close;} catch (Exception e) {e.printStackTrace;}}}return ;}} 
六、实验测试很简单二十多行代码就完成了,看看效果怎么样吧 。


推荐阅读