gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区

站長(zhǎng)資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

淺析node怎么實(shí)現(xiàn)ocr

怎么實(shí)現(xiàn)ocr(光學(xué)字符識(shí)別)?下面本篇文章給大家介紹一下使用node實(shí)現(xiàn)實(shí)現(xiàn)實(shí)現(xiàn)ocr的方法,希望對(duì)大家有所幫助!

淺析node怎么實(shí)現(xiàn)ocr

node.js極速入門課程:進(jìn)入學(xué)習(xí)

ocr即光學(xué)字符識(shí)別,簡(jiǎn)單的來(lái)說(shuō)就是把圖片上的文字識(shí)別出來(lái)。

很遺憾我只是一個(gè)底層的web程序員?,不咋會(huì)AI,要想實(shí)現(xiàn)ocr,只能找找第三方庫(kù)了。

python語(yǔ)言有很多ocr的第三方庫(kù),找了很久nodejs實(shí)現(xiàn)ocr的第三方庫(kù),最后發(fā)現(xiàn)了tesseract.js這個(gè)庫(kù)還是能很方便的實(shí)現(xiàn)ocr。【相關(guān)教程推薦:nodejs視頻教程】

效果展示

在線示例: http://www.lolmbbs.com/tool/ocr

淺析node怎么實(shí)現(xiàn)ocr

詳細(xì)代碼

tesserract.js 這個(gè)庫(kù)提供了多個(gè)版本供選擇,我這里使用的是離線的版本tesseract.js-offline,畢竟誰(shuí)都由網(wǎng)絡(luò)不好的時(shí)候。
淺析node怎么實(shí)現(xiàn)ocr
默認(rèn)示例代碼

const { createWorker } = require('tesseract.js'); const path = require('path');  const worker = createWorker({   langPath: path.join(__dirname, '..', 'lang-data'),    logger: m => console.log(m), });  (async () => {   await worker.load();   await worker.loadLanguage('eng');   await worker.initialize('eng');   const { data: { text } } = await worker.recognize(path.join(__dirname, '..', 'images', 'testocr.png'));   console.log(text);   await worker.terminate(); })();
登錄后復(fù)制

1. 支持多語(yǔ)言識(shí)別

tesseract.js 離線版本默認(rèn)示例代碼只支持識(shí)別英文,如果識(shí)別中文,結(jié)果會(huì)是一堆問號(hào)。但是幸運(yùn)的是你可以導(dǎo)入多個(gè)訓(xùn)練好的語(yǔ)言模型,讓它支持多個(gè)語(yǔ)言的識(shí)別。

  • 從https://github.com/naptha/tessdata/tree/gh-pages/4.0.0這里下載你需要的對(duì)應(yīng)語(yǔ)言模型,放入到根目錄下的lang-data目錄下
    我這里選擇了中(chi_sim.traineddata.gz)日(jpn.traineddata.gz)英(eng.traineddata.gz)三國(guó)語(yǔ)言模型。

  • 修改代碼中加載和初始化模型的語(yǔ)言項(xiàng)配置,來(lái)同時(shí)支持中日英三國(guó)語(yǔ)言。

await worker.loadLanguage('chi_sim+jpn+eng'); await worker.initialize('chi_sim+jpn+eng');
登錄后復(fù)制

為了方便大家的測(cè)試,我在示例的離線版本,已經(jīng)放入了中日韓三國(guó)語(yǔ)言的訓(xùn)練模型和實(shí)例代碼以及測(cè)試圖片。
https://github.com/Selenium39/tesseract.js-offline

2. 提高識(shí)別性能

如果你運(yùn)行了離線的版本,你會(huì)發(fā)現(xiàn)模型的加載和ocr的識(shí)別有點(diǎn)慢。可以通過(guò)這兩個(gè)步驟優(yōu)化。

  • web項(xiàng)目中,你可以在應(yīng)用一啟動(dòng)的時(shí)候就加載模型,這樣后續(xù)接收到ocr請(qǐng)求的時(shí)候就可以不用等待模型加載了。

  • 參照Why I refactor tesseract.js v2?這篇博客,可以通過(guò)createScheduler方法添加多個(gè)worker線程來(lái)并發(fā)的處理ocr請(qǐng)求。

多線程并發(fā)處理ocr請(qǐng)求示例

const Koa = require('koa') const Router = require('koa-router') const router = new Router() const app = new Koa() const path = require('path') const moment = require('moment') const { createWorker, createScheduler } = require('tesseract.js')  ;(async () => {   const scheduler = createScheduler()   for (let i = 0; i < 4; i++) {     const worker = createWorker({       langPath: path.join(__dirname, '.', 'lang-data'),       cachePath: path.join(__dirname, '.'),       logger: m => console.log(`${moment().format('YYYY-MM-DD HH:mm:ss')}-${JSON.stringify(m)}`)     })     await worker.load()     await worker.loadLanguage('chi_sim+jpn+eng')     await worker.initialize('chi_sim+jpn+eng')     scheduler.addWorker(worker)   }   app.context.scheduler = scheduler })()  router.get('/test', async (ctx) => {   const { data: { text } } = await ctx.scheduler.addJob('recognize', path.join(__dirname, '.', 'images', 'chinese.png'))   // await ctx.scheduler.terminate()   ctx.body = text })  app.use(router.routes(), router.allowedMethods()) app.listen(3002)
登錄后復(fù)制

發(fā)起并發(fā)請(qǐng)求,可以看到多個(gè)worker再并發(fā)執(zhí)行ocr任務(wù)

ab -n 4 -c 4 localhost:3002/test

淺析node怎么實(shí)現(xiàn)ocr

3.前端代碼

效果展示中的前端代碼主要是用了elementui組件和vue-cropper這個(gè)組件實(shí)現(xiàn)。

vue-cropper組件具體的使用可以參考我的這篇博客vue圖片裁剪:使用vue-cropper做圖片裁剪

ps: 上傳圖片的時(shí)候可以先在前端加載上傳圖片的base64,先看到上傳的圖片,再請(qǐng)求后端上傳圖片 ,對(duì)用戶的體驗(yàn)比較好

完整代碼如下

<template>   <div>     <div style="margin-top:30px;height:500px">       <div class="show">         <vueCropper           v-if="imgBase64"           ref="cropper"           :img="imgBase64"           :output-size="option.size"           :output-type="option.outputType"           :info="true"           :full="option.full"           :can-move="option.canMove"           :can-move-box="option.canMoveBox"           :original="option.original"           :auto-crop="option.autoCrop"           :fixed="option.fixed"           :fixed-number="option.fixedNumber"           :center-box="option.centerBox"           :info-true="option.infoTrue"           :fixed-box="option.fixedBox"           :max-img-size="option.maxImgSize"           style="background-image:none"           @mouseenter.native="enter"           @mouseleave.native="leave"         ></vueCropper>         <el-upload           v-else           ref="uploader"           class="avatar-uploader"           drag           multiple           action=""           :show-file-list="false"           :limit="1"           :http-request="upload"         >           <i class="el-icon-plus avatar-uploader-icon"></i>         </el-upload>       </div>       <div         class="ocr"         @mouseleave="leaveCard"       >         <el-card           v-for="(item,index) in ocrResult"           :key="index"           class="card-box"           @mouseenter.native="enterCard(item)"         >           <el-form             size="small"             label-width="100px"             label-position="left"           >             <el-form-item label="識(shí)別結(jié)果">               <el-input v-model="item.text"></el-input>             </el-form-item>           </el-form>         </el-card>       </div>     </div>     <div style="margin-top:10px">       <el-button         size="small"         type="primary"         style="width:60%"         @click="doOcr"       >         文字識(shí)別(OCR)       </el-button>     </div>   </div> </template>  <script> import { uploadImage, ocr } from '../utils/api' export default {   name: 'Ocr',   data () {     return {       imgSrc: '',       imgBase64: '',       option: {         info: true, // 裁剪框的大小信息         outputSize: 0.8, // 裁剪生成圖片的質(zhì)量         outputType: 'jpeg', // 裁剪生成圖片的格式         canScale: false, // 圖片是否允許滾輪縮放         autoCrop: true, // 是否默認(rèn)生成截圖框         fixedBox: false, // 固定截圖框大小 不允許改變         fixed: false, // 是否開啟截圖框?qū)捀吖潭ū壤?        fixedNumber: [7, 5], // 截圖框的寬高比例         full: true, // 是否輸出原圖比例的截圖         canMove: false, // 時(shí)候可以移動(dòng)原圖         canMoveBox: true, // 截圖框能否拖動(dòng)         original: false, // 上傳圖片按照原始比例渲染         centerBox: true, // 截圖框是否被限制在圖片里面         infoTrue: true, // true 為展示真實(shí)輸出圖片寬高 false 展示看到的截圖框?qū)捀?        maxImgSize: 10000       },       ocrResult: []     }   },   methods: {     upload (fileObj) {       const file = fileObj.file       const reader = new FileReader()       reader.readAsDataURL(file)       reader.onload = () => {         this.imgBase64 = reader.result       }       const formData = new FormData()       formData.append('image', file)       uploadImage(formData).then(res => {         this.imgUrl = res.imgUrl       })     },     doOcr () {       const cropAxis = this.$refs.cropper.getCropAxis()       const imgAxis = this.$refs.cropper.getImgAxis()       const cropWidth = this.$refs.cropper.cropW       const cropHeight = this.$refs.cropper.cropH       const position = [         (cropAxis.x1 - imgAxis.x1) / this.$refs.cropper.scale,         (cropAxis.y1 - imgAxis.y1) / this.$refs.cropper.scale,         cropWidth / this.$refs.cropper.scale,         cropHeight / this.$refs.cropper.scale       ]       const rectangle = {         top: position[1],         left: position[0],         width: position[2],         height: position[3]       }       if (this.imgUrl) {         ocr({ imgUrl: this.imgUrl, rectangle }).then(res => {           this.ocrResult.push(             {               text: res.text,               cropInfo: { //截圖框顯示的大小                 width: cropWidth,                 height: cropHeight,                 left: cropAxis.x1,                 top: cropAxis.y1               },               realInfo: rectangle //截圖框在圖片上真正的大小             })         })       }     },     enterCard (item) {       this.$refs.cropper.goAutoCrop()// 重新生成自動(dòng)裁剪框       this.$nextTick(() => {         // if cropped and has position message, update crop box         // 設(shè)置自動(dòng)裁剪框的寬高和位置         this.$refs.cropper.cropOffsertX = item.cropInfo.left         this.$refs.cropper.cropOffsertY = item.cropInfo.top         this.$refs.cropper.cropW = item.cropInfo.width         this.$refs.cropper.cropH = item.cropInfo.height       })     },     leaveCard () {       this.$refs.cropper.clearCrop()     },     enter () {       if (this.imgBase64 === '') {         return       }       this.$refs.cropper.startCrop() // 開始裁剪     },     leave () {       this.$refs.cropper.stopCrop()// 停止裁剪     }   }  } </script>
登錄后復(fù)制

贊(0)
分享到: 更多 (0)
網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)
gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区
国产精品沙发午睡系列| 日韩高清在线一区二区| 一级片黄色免费| 国产精品va无码一区二区| 午夜久久福利视频| 2022亚洲天堂| 国产成人永久免费视频| 亚洲精品第三页| 黄色免费观看视频网站| 欧美亚洲色图视频| 国产高清999| 国产色视频在线播放| 欧美 日韩 国产在线观看| 国产91在线亚洲| 青青草免费在线视频观看| 亚洲欧美日本一区二区三区| 日本va中文字幕| 丝袜制服一区二区三区| 免费在线激情视频| jizzjizzxxxx| 一本久道综合色婷婷五月| 亚洲熟妇国产熟妇肥婆| 欧美精品一区二区三区三州| 欧美极品少妇无套实战| 国产成人一二三区| 国产一级不卡视频| 丁香花在线影院观看在线播放| 糖心vlog在线免费观看| 艳母动漫在线免费观看| 黄色一级大片免费| 国产毛片久久久久久国产毛片| 日b视频免费观看| 久久亚洲a v| 国产极品尤物在线| 亚洲中文字幕无码不卡电影| aaa毛片在线观看| 狠狠干狠狠操视频| 亚洲综合在线一区二区| 女人床在线观看| 国产欧美日韩网站| 91激情视频在线| 国产精品久久久久久久av福利| 青青草原播放器| 成人免费看片'免费看| 日韩欧美视频网站| 日本黄大片一区二区三区| 成年人黄色在线观看| 国产中文字幕乱人伦在线观看| 亚洲午夜无码av毛片久久| 在线免费av播放| 男人j进女人j| 人妻内射一区二区在线视频| 欧美成人福利在线观看| 男同互操gay射视频在线看| 欧美a v在线播放| 国产福利在线免费| 国产欧美日韩网站| 久久国产这里只有精品| 特大黑人娇小亚洲女mp4| 99精品人妻少妇一区二区| 国产精品嫩草影院8vv8| 国产精品又粗又长| 欧美国产日韩另类 | 国内自拍在线观看| 亚洲视频一二三四| 免费看毛片的网址| 亚洲精品中文字幕乱码无线| 国内精品在线观看视频| 亚洲理论中文字幕| 无遮挡又爽又刺激的视频| 成年丰满熟妇午夜免费视频 | 国产成人综合一区| 国产一级做a爰片久久毛片男| 久久综合久久色| 国产高清www| 视频一区二区视频| 亚洲视频第二页| 99福利在线观看| 国产免费裸体视频| 女女百合国产免费网站| 五月婷婷之婷婷| www.99在线| 中文字幕乱码人妻综合二区三区| 日本一本中文字幕| 丰满女人性猛交| 亚洲制服在线观看| 污污网站免费看| 2025韩国理伦片在线观看| 草草草在线视频| 男人操女人免费软件| 久久久久免费看黄a片app| av中文字幕av| 黄色一级片黄色| 国产在线无码精品| 国产青草视频在线观看| 免费极品av一视觉盛宴| 波多野结衣三级在线| 18视频在线观看娇喘| 免费观看黄色的网站| 性生活免费观看视频| 亚洲色婷婷久久精品av蜜桃| 无颜之月在线看| 加勒比成人在线| 欧美 日韩 亚洲 一区| 少妇性饥渴无码a区免费| 欧美 激情 在线| 男操女免费网站| 99九九99九九九99九他书对| 伊人五月天婷婷| 97碰在线视频| 国产美女三级视频| 久热在线视频观看| japanese在线视频| 日韩a级在线观看| 波多野结衣家庭教师视频| 久久久久久久久久久久91| www.亚洲自拍| 无码人妻少妇伦在线电影| 99蜜桃臀久久久欧美精品网站| 北条麻妃av高潮尖叫在线观看| 视色视频在线观看| 欧美交换配乱吟粗大25p| 亚洲 高清 成人 动漫| 视频免费1区二区三区| 国产乱淫av片杨贵妃| 高清av免费看| 精品少妇人欧美激情在线观看| 免费男同深夜夜行网站| 欧美性受xxxx黑人猛交88| 成人综合视频在线| 日韩a一级欧美一级| 黄色影院一级片| 亚洲欧美手机在线| 男人的天堂99| 国产91视频一区| 五月激情婷婷在线| 免费欧美一级视频| 久久国产精品免费观看| 久草福利视频在线| 日本福利视频一区| 吴梦梦av在线| 欧美性猛交久久久乱大交小说 | 中文字幕の友人北条麻妃| 99免费视频观看| 久久香蕉视频网站| www.精品在线| 久草资源站在线观看| 国产女教师bbwbbwbbw| 天堂av8在线| 亚洲视频在线观看一区二区三区| 国产青草视频在线观看| 中文字幕亚洲影院| 色免费在线视频| 熟女人妇 成熟妇女系列视频| 乱熟女高潮一区二区在线| 中文字幕免费高清在线| 一本久道中文无码字幕av| 国产成人精品视频免费看| 久久99久久久久久| 永久免费看av| 最近免费观看高清韩国日本大全| 亚洲一区二区福利视频| 日韩一级理论片| 亚洲色图38p| 成人免费xxxxx在线视频| 欧美一级黄色片视频| 日韩精品一区二区三区色欲av| 国产精品国产亚洲精品看不卡| 黄色激情在线视频| 无码熟妇人妻av在线电影| 99久久国产综合精品五月天喷水| 欧美人与动牲交xxxxbbbb| 欧美亚洲色图视频| 成人性免费视频| 激情综合网婷婷| 日韩不卡一二三| 亚洲男人天堂2021| 51xx午夜影福利| 自慰无码一区二区三区| 欧美性久久久久| 奇米视频7777| 成人污网站在线观看| 怡红院av亚洲一区二区三区h| 国产精品动漫网站| 欧美美女性视频| av动漫在线播放| 日本福利视频一区| 免费激情视频在线观看| 久久久久久久高清| 男人c女人视频| 亚洲少妇第一页| 公共露出暴露狂另类av| 欧美在线一区视频| 日韩一区二区三区不卡视频| 国产麻豆电影在线观看| 精品久久一二三| 黄色一级片免费播放| 国产97在线 | 亚洲| 精品综合久久久久| 鲁一鲁一鲁一鲁一澡|