图⽚提取⽂字功能很神奇?Java⼏⾏代码搞定它!
点击上⽅“Java精选”,选择“设为星标”
别问别⼈为什么,多问⾃⼰凭什么!
下⽅留⾔必回,有问必答!
每天 08:00 更新⽂章,每天进步⼀点点...
摘要
近⽇浏览⽹上⼀些图⽚提取⽂字的⽹站,觉得甚是有趣,花费半⽇也做了个在线图⽚识别程序,完成了两个技术⽅案的选择,⼀是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.到。
关于tesseract的⼯作模式如上图所⽰。假设现在有⼀个图⽚输⼊,整个执⾏流程为:
1. 输⼊(⼀张图⽚)
2. 有⽤信息提取(⽐如⼀个图⽚上只有⼀个字,那其他留⽩的是⽆⽤,这个字上每个⾊素是有效的并且相关)
3. 出⽂字/线条
4. 字符分类集
5. 输⼊与分类集对⽐出最接近的
6. 输出识别结果
⼆、安装tesseract
第⼀步下载
下载合适的exe安装⽂件:
第⼆步环境变量配置
在path变量中加⼊tesseract-ocr的安装路径
第三步安装成功检测
使⽤tesseract指令,显⽰如下:
linux环境下载安装与上述类似
下载leptonica 和 tesseract两个包,解压安装,配置环境变量即可。⽹上很容易到该安装包。
学习资料:
三、使⽤命令⾏
⽰列: tesseract 1606150081.png 1606150081 -l chi_sim
python转java代码
⽰列: tesseract D:\company\ruigushop\spring-2s\test.png stdout -l chi_sim
有了上述之后就可以完成web图⽚识别程序的开发啦,废话不多说,直接上代码。
四、程序实现(Python)
程序设计思路:
上传图⽚ -> 保存 ->对上传的图⽚执⾏tesseract指令->获取识别结果
只有⼆⼗多⾏代码就实现了,so easy,以后⽹上看到图⽚识别程序再也不会感觉神奇了吧!
# coding=utf-8
from flask import Flask, request
import os
import datetime
import time
app = Flask(__name__)
def get_time_stamp():
times = w().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
@ute('/image/extract', methods=['POST'])
def pure_rec():
file = ('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.read()
return result
if __name__ == '__main__':
app.run(debug=True)
五、程序实现(Java)
不需要任何引⼊第三⽅jar包,搭建⼀个简单的springboot web项⽬就可以了,没有其他额外的依赖。Controller:
package com.ller;
/*
* Copyright@lbhbinhao@163
* Author:liubinhao
* Author:liubinhao
* Date:2020/11/23
* ++++ ______ @author      liubinhao  ______            ______
* +++/    /|                        /    /|          /    /|
* +/_____/  |                      /_____/  |        /_____/  |
* |    |  |                      |    |  |        |    |  |
* |    |  |                      |    |  |________|    |  |
* |    |  |                      |    |  /        |    |  |
* |    |  |                      |    |/___________|    |  |
* |    |  |___________________  |    |____________|    |  |
* |    |  /                  / |  |    |  |        |    |  |
* |    |/ _________________/  /  |    |  /        |    |  /
* |_________________________|/b    |_____|/          |_____|/
*/
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
@RestController
public class LiteralExtractController {
@PostMapping("/image/extract")
public String reg(@RequestParam("file")MultipartFile file) throws IOException {
String result = "";
String filename = OriginalFilename();
File save = new Property("user.dir")+"\\"+filename);
if (!ists()){
}
String cmd = String.format("tesseract %s stdout -l %s",Property("user.dir")+"\\"+filename,"chi_sim");        result = cmd(cmd);
return result;
}
public static String cmd(String cmd) {
BufferedReader br = null;
try {
Process p = Runtime().exec(cmd);
br = new BufferedReader(new InputStream()));
String line = null;
StringBuilder sb = new StringBuilder();
while ((line = br.readLine()) != null) {
sb.append(line + "\n");
}
String();
} catch (Exception e) {
e.printStackTrace();
}
finally
{
if (br != null)
{
try {
br.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
return null;
}
}
哈哈哈,还有帅⽓的程序logo。学习资料:
六、实验测试
很简单⼆⼗多⾏代码就完成了,看看效果怎么样吧。
测试⼀图⽚:
测试⼀结果:
测试⼆图⽚:
测试⼆结果:
perfect,识别的很准确,第⼆个测试全部是英⽂字符的时候我们采⽤了中⽂训练的数据集,虽然也很好的识别了,但是速度会慢很多。七、总结
图⽚识别在当今⽹络技术领域是⾮常热门的⼀块,⽽这次完成的这个程序完全是依赖别⼈开源框架来完成了这个技术实现,在应⽤层⾯这是成功的,但是本质上并没有实际算法,技术核⼼上的东西,如果只关⼼应⽤层开发上述解决了我们计算机在规则字符识别上的问题。
上述代码中基本没有难点,直接复制即可使⽤。此外,tesseract作为⼀款优秀的开源字符识别软件,但它也不是万能的,tesseract只能识别规则的字符,对于⼀些艺术字,抽象字它是⽆能为⼒的。
作者:兴趣使然的程序猿
blog.csdn/weixin_44671737/article/details/110000864
精品资料,超赞福利!
>Java精选⾯试题<
3000+ 道⾯试题在线刷,最新、最全 Java ⾯试题!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。