利用java完成图像文字识别和翻译,实现拍照翻译的功能
需求:利用java完成圖像文字識別和翻譯,實(shí)現(xiàn)拍照翻譯的功能
? 可拆分為以下兩個小的功能逐一完成:
(1)實(shí)現(xiàn)圖像文字識別
(2)將識別出來的文字進(jìn)行翻譯。
1.實(shí)現(xiàn)圖像文字識別
? 利用Tess4J進(jìn)行圖像文字識別
1.1 為方便集成tess4j的jar包,我們先創(chuàng)建一個maven項(xiàng)目,將所需jar包引入pom.xml
<dependency><groupId>net.sourceforge.tess4j</groupId><artifactId>tess4j</artifactId><version>4.4.0</version></dependency>1.2 我們還需要下載語言數(shù)據(jù)包,進(jìn)入此倉庫https://github.com/tesseract-ocr/tessdata將常用的chi_sim.traineddata 和 eng.traineddata語言包下載下來,存放在一個文件夾中,后面圖像文字識別需要用到。我存放在F:\IDEA1\xiaochengxu\src\main\resources\lang
1.3 編寫java代碼調(diào)用Tess4J和語言包進(jìn)行圖像文字識別。
//圖片識別 傳一個圖片和語言(eng/chi_sim)@PostMapping("/tess4J")public String Tess4J(@RequestParam("img") MultipartFile img,String language) throws Exception {// 語言庫位置(修改為跟自己上一步下載的語言庫文件夾的路徑)String lagnguagePath = "F:\\IDEA1\\xiaochengxu\\src\\main\\resources\\lang";ITesseract instance = new Tesseract();//設(shè)置訓(xùn)練庫的位置instance.setDatapath(lagnguagePath);//chi_sim簡體中文, eng英文instance.setLanguage(language); //chi_simString result = null;try {long startTime = System.currentTimeMillis();result = instance.doOCR(MultipartFileToFile.multipartFileToFile(img)); //MultipartFileToFile類在下方long endTime = System.currentTimeMillis();System.out.println("Time is:" + (endTime - startTime) + " 毫秒");} catch (TesseractException e) {e.printStackTrace();}System.out.println("result: ");System.out.println(result);return result;} //MultipartFile轉(zhuǎn)成file public class MultipartFileToFile {public static File multipartFileToFile(MultipartFile file) throws Exception {File toFile = null;if (file.equals("") || file.getSize() <= 0) {file = null;} else {InputStream ins = null;ins = file.getInputStream();toFile = new File(file.getOriginalFilename());inputStreamToFile(ins, toFile);ins.close();}return toFile;}//獲取流文件private static void inputStreamToFile(InputStream ins, File file) {try {OutputStream os = new FileOutputStream(file);int bytesRead = 0;byte[] buffer = new byte[8192];while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {os.write(buffer, 0, bytesRead);}os.close();ins.close();} catch (Exception e) {e.printStackTrace();}} }1.4 此時我們已經(jīng)寫好了一個接口,將圖片和語言(英文eng/中文chi_sim)兩個參數(shù)傳入此接口就能返回圖片的文字。配置一下swagger更方便測試。配置swagger教程http://www.gnnu.work/comm/articledetail?articleId=NTY%3D
2.將識別出來的文字進(jìn)行翻譯
接口寫好了,這里使用微信小程序作為前端調(diào)用此接口。
整體思路就是:在微信小程序中使用wx.chooseImage喚起手機(jī)圖片系統(tǒng),上傳一張圖片,通過js發(fā)一個請求,將圖片傳給第一步寫好的后端,后端對圖片進(jìn)行識別,后端將識別后的文字返回給前端,前端再調(diào)用翻譯的接口將文字翻譯即可。
小程序端代碼如下:使用了vant https://youzan.github.io/vant-weapp/#/tab
html <van-tabs active="{{activename}}" bind:change="tabonChange" ><van-tab title="1.拍照識別" name="1" ><view style="display:flex;align-items:center;"><text style="font-weight:700;margin-right:10px">識別成什么語言:</text><van-dropdown-menu><van-dropdown-item bind:change="changeorclanguage" value="{{ orclanguage }}" options="{{ option1 }}" /></van-dropdown-menu></view><button style="" type="primary" disabled="{{disabled1}}" bindtap="uploadImg">{{disabled1?"正在識別中,請稍等":"拍照"}}</button><!-- {{orcString}} --></van-tab><van-tab title="2.翻譯" name="2"><view style="display:flex;align-items:center;"><text style="font-weight:700;margin-right:10px">翻譯成什么語言:</text><van-dropdown-menu><van-dropdown-item bind:change="changetranslatelanguage" value="{{ translatelanguage }}" options="{{ option2 }}" /></van-dropdown-menu></view><button type="primary" bindtap="translate">翻譯</button><!-- {{translatelanguage}} --><van-cell-group><van-fieldmodel:value="{{ orcString }}"placeholder="請輸入需要翻譯的內(nèi)容"type="textarea"autosize/></van-cell-group><!-- <textarea model:value="{{orcString}}" style="margin-top:10px;border:2px solid #ccc;width:100%" /> --></van-tab><van-tab title="3.結(jié)果" name="3"><view style="display:flex;align-items:center;"><text style="font-weight:700;margin-right:10px;margin-bootom:1px solid #ccc"> 是否顯示原文:</text><van-switch checked="{{ showorigin }}" bind:change="changetranslateResutl" size="24px" /></view><view class="adviseCon" wx:for="{{translateResutl}}" wx:for-item="item" wx:for-index="idx" wx:key="idx"><view ><view wx:if="{{showorigin}}" style=";margin-bottom:5px" >{{item.src}}</view><view style="color:red;margin-bottom:5px" >{{item.dst}}</view></view></view></van-tab> </van-tabs> // pages/imgtranslate/imgtranslate.js Page({/*** 頁面的初始數(shù)據(jù)*/data: {orcString:'請輸入', //識別圖像的結(jié)果activename:'1', //當(dāng)前的disabled1:false, //是否禁用第一個按鈕option1: [ //識圖的語言{ text: '中文', value: 'chi_sim' },{ text: '英文', value: 'eng' },],orclanguage:'chi_sim', //識別的目標(biāo)語言option2: [ //翻譯的語言{ text: '自動', value: 'auto' },{ text: '英文', value: 'en' },{ text: '中文', value: 'zh' },],translatelanguage:'auto', //翻譯的語言translateResutl:[] ,//翻譯后的結(jié)果showorigin:true, //在翻譯后是否顯示原文對比},//選擇識別的語言changeorclanguage:function(e){// console.log(e.detail)this.setData({orclanguage:e.detail,}) },//選擇翻譯的語言changetranslatelanguage:function(e){// console.log(e.detail)this.setData({translatelanguage:e.detail,}) },changetranslateResutl:function(e){// console.log(e.detail)this.setData({showorigin:e.detail,}) },tabonChange:function(e){console.log(e.detail)this.setData({activename:e.detail.name,}) },//識別圖片uploadImg:function(){var _this = this;wx.chooseImage({count: 1, // 默認(rèn)9sizeType: ['original', 'compressed'], // 可以指定是原圖還是壓縮圖,默認(rèn)二者都有sourceType: ['album', 'camera'], // 可以指定來源是相冊還是相機(jī),默認(rèn)二者都有success: (res)=> {_this.setData({disabled1:true,}) // 返回選定照片的本地文件路徑列表,tempFilePath可以作為img標(biāo)簽的src屬性顯示圖片var that = _this;var tempFilePaths = res.tempFilePathswx.uploadFile({url: 'http://127.0.0.1:8080/tess4J?language='+that.data.orclanguage,filePath: tempFilePaths[0],name: 'img',success: function(res){var data = res.data;console.log(res)that.setData({orcString : res.data,activename: "2",disabled1:false,}) },fail:function(){wx.showToast({ title: '服務(wù)器錯誤!', icon: 'none', duration: 2500 })that.setData({disabled1:false,}) }})},fail:function(){wx.showToast({ title: '是你自己放棄的', icon: 'none', duration: 2500 })_this.setData({disabled1:false,}) }})},translate:function(){if(this.data.orcString == ""){wx.showToast({title: '什么都沒有翻譯個毛線,下方可以輸入',icon: 'none',duration: 5500})return}var that = this;that.setData({translateResutl:[],activename: "3",}) // console.log(this.data.orcString)wx.request({url: 'http://127.0.0.1:8080/bdtranslate',header: {"Content-Type": "application/x-www-form-urlencoded"},method: "POST",data: {word:this.data.orcString,origin:"auto",to:this.data.translatelanguage},success: function (res) {console.log(res)wx.showToast({title: '翻譯成功',icon: 'none',duration: 1500})that.setData({translateResutl : res.data.trans_result,activename: "3",}) },fail:function(){wx.showToast({ title: '服務(wù)器錯誤!', icon: 'none', duration: 1500 })}})},})
最后線上體驗(yàn)請微信掃碼
總結(jié)
以上是生活随笔為你收集整理的利用java完成图像文字识别和翻译,实现拍照翻译的功能的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2020最新版SpringMVC面试题高
- 下一篇: linux mysql5.7.11_在L