Java开发入门到实战--几行 Java 代码搞定图片提取文字功能
小职 2021-09-22 来源 :java版web项目 阅读 440 评论 0

摘要:本篇主要介绍了Java开发入门到实战--几行 Java 代码搞定图片提取文字功能,通过具体的内容展现,希望对Java开发的学习有一定的帮助。

本篇主要介绍了Java开发入门到实战--几行 Java 代码搞定图片提取文字功能,通过具体的内容展现,希望对Java开发的学习有一定的帮助。

Java开发入门到实战--几行 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开发入门到实战--几行 Java 代码搞定图片提取文字功能

 

 

关于tesseract的工作模式如上图所示。假设现在有一个图片输入,整个执行流程为:

 

 输入(一张图片)

 有用信息提取(比如一个图片上只有一个字,那其他留白的是无用,这个字上每个色素是有效的并且相关)

 找出文字/线条

 字符分类集

 输入与分类集对比找出最接近的

 输出识别结果

二、安装tesseract

第一步下载

下载合适的exe安装文件:

 

网址:https://digi.bib.uni-mannheim.de/tesseract/,下载完成后后装即可

 Java开发入门到实战--几行 Java 代码搞定图片提取文字功能

 

 

第二步环境变量配置

在path变量中加入tesseract-ocr的安装路径

 Java开发入门到实战--几行 Java 代码搞定图片提取文字功能

 

 

第三步安装成功检测

使用tesseract指令,显示如下:

 Java开发入门到实战--几行 Java 代码搞定图片提取文字功能

 

 

Linux环境下载安装与上述类似

 Java开发入门到实战--几行 Java 代码搞定图片提取文字功能

 

 

下载leptonica 和 tesseract两个包,解压安装,配置环境变量即可。网上很容易找到该安装包。

 

三、使用命令行

1.tesseract + 图片路径 + 保存结果名 + -l 语言集

 

示列: tesseract 1606150081.png 1606150081 -l chi_sim

 

2.tesseract + 图片路径 +stdout -l +语言集

 

示列: 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 = 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.read()  

        return result   

if __name__ == '__main__':  

    app.run(debug=True)

五、程序实现(Java)

不需要任何引入第三方jar包,搭建一个简单的 Springboot Web 项目就可以了,没有其他额外的依赖。

 

Controller:

 

@RestController  

public class LiteralExtractController {  

    @PostMapping("/image/extract")  

    public String reg(@RequestParam("file")MultipartFile file) throws IOException {  

        String result = "";  

        String filefilename = 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 = null;  

        try {  

            Process p = Runtime.getRuntime().exec(cmd);  

            br = new BufferedReader(new InputStreamReader(p.getInputStream()));  

            String line = null;  

            StringBuilder sb = new StringBuilder();  

            while ((line = br.readLine()) != null) {  

                sb.append(line + "\n");  

            }  

            return sb.toString();  

        } catch (Exception e) {  

            e.printStackTrace();  

        }  

        finally  

        {  

            if (br != null)  

            {  

                try {  

                    br.close();  

                } catch (Exception e) {  

                    e.printStackTrace();  

                }  

            }  

        }  

        return null;  

    }  

}

六、实验测试

很简单二十多行代码就完成了,看看效果怎么样吧。

 

测试一图片:

 Java开发入门到实战--几行 Java 代码搞定图片提取文字功能

 

 

测试一结果:

 Java开发入门到实战--几行 Java 代码搞定图片提取文字功能

 

 

测试二图片:

 Java开发入门到实战--几行 Java 代码搞定图片提取文字功能

 

 

测试二结果:

 Java开发入门到实战--几行 Java 代码搞定图片提取文字功能

 

perfect,识别的很准确,第二个测试全部是英文字符的时候我们采用了中文训练的数据集,虽然也很好的识别了,但是速度会慢很多。

 

七、总结

图片识别在当今网络技术领域是非常热门的一块,而这次完成的这个程序完全是依赖别人开源框架来完成了这个技术实现,在应用层面这是成功的,但是本质上并没有实际算法,技术核心上的东西,如果只关心应用层开发上述解决了我们计算机在规则字符识别上的问题。

 

上述代码中基本没有难点,直接复制即可使用。此外,tesseract作为一款优秀的开源字符识别软件,但它也不是万能的,tesseract只能识别规则的字符,对于一些艺术字,抽象字它是无能为力的。


我是小职,记得找我

✅ 解锁高薪工作

✅ 免费获取基础课程·答疑解惑·职业测评

Java开发入门到实战--几行 Java 代码搞定图片提取文字功能

本文由 @小职 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程