当前位置: 首页 > 后端技术 > Java

从图片中提取文本的几行Java代码令人惊叹,.

时间:2023-04-01 14:21:41 Java

来源:blog.csdn.net/weixin_44671737/article/details/110000864摘要最近浏览了网上一些网站的图片提取文字,觉得很有意思。花了半天时间做了一个在线图片识别程序,完成了两项技术。方案的选择,一个是tesseract+pythonflask方案的实现,一个是tesseract+springweb的技术方案,简单讨论一下,分享给大家。一、tesseract-ocr简介ocr的意思是OpticalCharacterRecognition,即视觉字符识别。Tesseract是该领域特别优秀的开源作品。tesseract官方定义:OCR引擎——libtesseract和一个命令行程序——tesseract。即tesseract包括视觉字符识别引擎libtesseract和命令行程序tesseract。目前最新的稳定版是基于LSTM的4.x.x,源码可以在GitHub上找到:tesseract。在哪里可以找到tesseract。tesseract的工作模式如上图所示。假设现在有一张图片输入,整个执行过程就是:输入(一张图片)有用的信息提取(比如一张图片上只有一个字,其他空格都没用,这个字上的每一种颜料有效且相关)找到文本/行字符分类集将输入与分类集进行比较,找到最接近的输出识别结果2.安装tesseract第一步下载下载合适的exe安装文件:网址:https://digi.bib.uni-mannheim...,下载完成后,就可以安装了。第二步是配置环境变量。将tesseract-ocr的安装路径添加到path变量中。第三步检测安装是否成功。tesseract两个包,解压安装,配置环境变量。安装包在网上很容易找到。3、使用命令行1.tesseract+图片路径+保存结果名称+-l语言设置列表:tesseract1606150081.png1606150081-lchi_sim2.tesseract+图片路径+stdout-l+语言设置列表:tesseractD:\company\ruigushop\spring-2s\test.pngstdout-lchi_sim有了上面就可以完成web图像识别程序的开发了,废话少说,直接上传代码即可。4、程序实现(Python)程序设计思路:上传图片->保存->对上传的图片执行tesseract指令->得到识别结果,只需要20多行代码就可以实现,soeasy,我会以后在网上看到图片识别程序再也不会觉得神奇了!#coding=utf-8fromflaskimportFlask,requestimportosimportdatetimeimporttimeapp=Flask(__name__)defget_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))returntime_stamp@app.route('/image/extract',methods=['POST'])defpure_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+"-lchi_sim"print(cmd)os.system(cmd)withopen(ts+".txt",'r+',encoding="utf-8")asf:result=f.read()returnresultif__name__=='__main__':app.run(debug=True)5.程序实现(Java)不需要引入任何第三方-partyjar包,只需要构建一个简单的springbootweb项目,不需要任何其他额外的依赖。我不会介绍SpringBoot的基础知识。推荐这个实用教程:https://www.javastack.cn/cate...Controller:packagecom.lbh.web.controller;/**Copyright@lbhbinhao@163.com*Author:liubinhao*Date:2020/11/23*++++______@authorliubinhao____________*+++//|//|//|*+/_____/|/______/|/______/|*|||||||||*|||||________|||*||||/|||*|||||/____________|||*|||*||//|||||||*|||/__________________//||/||/*|_________________________|/b|_____|/|_____|/*/importorg.springframework.web.bind.annotation.PostMapping;小鬼ortorg.springframework.web.bind.annotation.RequestParam;导入org.springframework.web.bind.annotation.RestController;导入org.springframework.web.multipart.MultipartFile;导入java.io.BufferedReader;导入java.io.File;importjava.io.IOException;importjava.io.InputStreamReader;@RestControllerpublicclassLiteralExtractController{@PostMapping("/image/extract")publicStringreg(@RequestParam("file")MultipartFilefile)throwsIOException{字符串结果="";Stringfilename=file.getOriginalFilename();文件保存=newFile(System.getProperty("user.dir")+"\\"+文件名);如果(!save.exists()){save.createNewFile();}file.transferTo(保存);Stringcmd=String.format("tesseract%sstdout-l%s",System.getProperty("user.dir")+"\\"+文件名,"chi_sim");结果=命令(命令);返回结果;}publicstaticStringcmd(Stringcmd){BufferedReaderbr=null;尝试{Processp=Runtime.getRuntime().exec(cmd);br=newBufferedReader(newInputStreamReader(p.getInputStream()));字符串行=空;StringBuildersb=newStringBuilder();while((line=br.readLine())!=null){sb.append(line+"\n");}返回sb.toString();}catch(Exceptione){e.printStackTrace();}finally{if(br!=null){try{br.close();}catch(Exceptione){e.printStackTrace();}}}返回空值;}}哈哈哈,还有帅气的程序logo6.实验测试很简单2十多行代码就完成了,来看看效果如何。测试1图片:测试1结果:测试2图片:测试2结果:perfect,识别的很准确,第二次测试的时候全是英文字符,我们用的是中文训练数据集,虽然也是很好识别,但是速度会慢很多。7.总结图片识别是当今网络技术领域非常热门的一个领域,而本次完成的程序完全依赖于别人的开源框架来完成本次技术实现。它在应用层面是成功的,但本质上是不实用的。算法,核心技术,如果你只关心应用层开发,上面解决了我们计算机正则字符识别的问题。上面的代码基本没有什么难点,直接复制就可以用了。另外,tesseract是一款优秀的开源字符识别软件,但也不是万能的。Tesseract只能识别规则字符,对一些艺术字符和抽象字符无能为力。近期热点文章推荐:1.1,000+Java面试题及答案(2021最新版)2.别在满屏的if/else中,试试策略模式,真的很好吃!!3.操!Java中xx≠null的新语法是什么?4、SpringBoot2.5发布,深色模式太炸了!5.《Java开发手册(嵩山版)》最新发布,赶快下载吧!感觉不错,别忘了点赞+转发!