autojs-ocr-easyedge-nodejs

目的

做一个有ocr功能的app

easyedge

是百度的产品, 有ocr功能, 且其发布了一个免费的离线app, 识别率还可以

autojs引擎

从autojspro9开始, 就有了两个引擎

图片

autojs内置nodejs, rhino, 并且支持双方通信

实现ocr的思路

如果会安卓开发的话, 可以把百度开源的paddle做成插件, 提供给autojs使用;

我不会安卓开发, 所以我选择了nodejs, 把ocr功能单独做一个app, 提供给脚本使用.

那么我们要实现这么一个接口.

http发送ocr请求, 然后返回ocr识别后的内容,

这里就出现了一个CS架构

图片

客户端

就一个http请求

let imgPath = "/sdcard/02.png";var url = "http://127.0.0.1:34567/";let r = http.postJson(url, {  action: "ocr",  imgPath: imgPath,});let obj = r.body.json();log(obj.result);

服务端

这个服务端的app大概要做哪些事情?

首先, 要接收客户端的请求, 必然要开启服务, 服务我们用的是koa, 大致流程如下

图片

这里就涉及到 了java和nodejs的通信问题:

easyedge使用的java, koa是nodejs.

java和nodejs通信

1. java给nodejs发消息:

这里首先要获取启动nodejs脚本的引擎, 然后再发送消息

const execution = $engines.execScriptFile("./server/index.js", {  arguments: {    serverEngineId: $engines.myEngine().id,  },});sleep(1000);execution.engine.emit("ocrResult", {  action: "ocr",  result: ocrResult,});

2. nodejs给java发消息

同上, 这里也要获取java的引擎, 然后再发送消息

// 从参数中取出Rhino引擎的IDconst serverEngineId = engines.myEngine().execArgv.serverEngineId;// 根据ID找出Rhino引擎const serverEngine = engines.getRunningEngines().find((e) => e.id === serverEngineId);serverEngine.emit("reply", params);

3. java接收消息

$events.on("reply", (data) => {});

4. nodejs接收消息

engines.myEngine().on("ocrResult", (ocrResult) => {});

nodejs怎么知道ocr识别完成

ocr识别图片里的文字是需要消耗时间的, 那么nodejs怎么知道ocr识别何时完成?

http--> nodejs--> easyedge--> nodejs;

nodejs仅仅只能把http发送的数据, 使用serverEngine.emit发送给java, 他的ctx是发送不过去的,

到这一步, nodejs就控制不了easyedge了,

nodejs能做的仅仅是和java交换一些简单的数据, ctx是交换不了的.

既然ocr需要时间, 那么我们先让http等一些时间, 再发送响应

new Promise(function (resolve, reject) {  let setTimeoutId = setTimeout(function () {    resolve(currentOcrResult);  }, 8000);});

这里使用的是promise, 延迟了8秒.

easyedge我测试了一下, 一般的图片1秒以内就返回数据了,

图片太大, 文字太多, 时间会更长一些, 不过8秒应该够了.

我们需要等8秒吗?

在8秒内, 我们可以每隔一段时间检查一下java是否把ocr识别的结果传给了nodejs,

如果nodejs接收到ocr的数据, 我们就可以中断这8秒钟的等待了

let setIntervalId = setInterval(function () {  if (currentOcrResult) {    clearTimeout(setTimeoutId);    resolve(currentOcrResult);    clearInterval(setIntervalId);  }}, 30);

我觉得这个setTimeout和setInterval配合Promise等待ocr识别结果, 这个思路是本教程的精华.

easyedge怎么封装到app里面

可以查看我之前的合并教程 autojs合并EasyEdge

autojs9.0.10之前应该都可以依照此方法合并,

在autojs9.0.11合并的时候, 不可以添加新的classes.dex到app中了, 会报错, 堆栈异常之类的.;

我们需要把classes.dex放到我们的脚本项目中, 然后用loaddex加载dex.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值