基于PaddleOCR开发Auto.js Pro文字识别插件

目录

目的

准备工作

插件开发

1、项目结构对比

2、插件SDK集成

3、调整assets资源

4、删除无用的Activity文件

5、修改AndroidManifest.xml

6、修改Predictor文件

7、修改包名

8、新建OCRPluginRegistry注册类

9、新建OCRPlugin插件类

10、新建OCRApi接口类

11、在新建index.js中编写api

12、打包插件

13、在auto.js Pro应用中编写js代码

总结


目的

AutoJS 类似于按键精灵,它是 Android 平台上的一款自动化工具,它通过编写 JavaScript 脚本,结合系统的「 无障碍服务 」对 App 进行自动化操作。在文字识别方面它提供的有一款OCR识别插件,但是其中有识别速度慢,插件大的缺点,所以这里将讲解一下如何集成基于PaddleOCR文字识别开发的插件,阅读本篇文字需要对PaddleOCR有个基本的了解,还需要有一点Android开发基础,文章最后有相关插件下载地址。

准备工作

1、android studio最新版本即可

下载地址:Download Android Studio and SDK tools  |  Android Developers

2、下载PaddleOCR提供的安卓版文字识别demo

下载地址:https://github.com/PaddlePaddle/PaddleOCR/tree/dygraph/deploy/android_demo

3、导入Android studio并成功运行

以上三步工作完成后,将开始我们的Auto.js Pro文字识别插件开发。

插件开发

1、项目结构对比

修改前 VS 修改后,调整了一些文件,去除了Activity入口。

 2、插件SDK集成

在项目的build.gradle文件中添加:

allprojects {
    repositories {
        // ...
        maven { url 'https://jitpack.io' }
    }
}

在app的build.gradle文件中添加:

dependencies {
    // ... 
    implementation 'com.alibaba:fastjson:1.1.46.android'
    implementation 'com.github.hyb1996:Auto.js-Plugin-SDK:0.2'
}

3、调整assets资源

新建ocr目录,并添加index.js文件,nb模型和txt文件如下图放置,注这里名字我修改了下。 

4、删除无用的Activity文件

 5、修改AndroidManifest.xml

两处包名替换成自己的包名,其他地方如下代码不动。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.yangy.ocr">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:debuggable="true"
        android:theme="@style/AppTheme"
        tools:ignore="HardcodedDebugMode">

        <meta-data
            android:name="org.autojs.plugin.sdk.registry"
            android:value="com.tomato.ocr.OCRPluginRegistry" />

    </application>

</manifest>

6、修改Predictor文件

添加这两行文件:

 

 调整loadLabel代码如下:

 7、修改包名

修改native.cpp文件,将官方的_com_baidu_paddle_lite_demo_ocr_替换成我们自己的包名,如_com_toamto_ocr_,如下截图:

8、新建OCRPluginRegistry注册类

package com.tomato.ocr;

import android.content.Context;

import org.autojs.plugin.sdk.Plugin;
import org.autojs.plugin.sdk.PluginLoader;
import org.autojs.plugin.sdk.PluginRegistry;

public class OCRPluginRegistry extends PluginRegistry {
    static {
        // 注册默认插件
        registerDefaultPlugin(new PluginLoader() {
            @Override
            public Plugin load(Context context, Context selfContext, Object runtime, Object topLevelScope) {
                return new OCRPlugin(context, selfContext, runtime, topLevelScope);
            }
        });
    }
}

9、新建OCRPlugin插件类

ckage com.tomato.ocr;

import android.content.Context;
import android.util.Log;

import org.autojs.plugin.sdk.Plugin;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

public class OCRPlugin extends Plugin {

    public OCRPlugin(Context context, Context selfContext, Object runtime, Object topLevelScope) {
        super(context, selfContext, runtime, topLevelScope);
    }

    @Override
    public String getAssetsScriptDir() {
        return "ocr";
    }

    public OCRApi createApi() throws IOException {
        return new OCRApi(this.getContext());
    }
}

10、新建OCRApi接口类

package com.tomato.ocr;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.media.ExifInterface;
import android.util.Log;

import com.alibaba.fastjson.JSONObject;

import java.io.File;
import java.io.IOException;

public class OCRApi {

    private final int useOpencl = 0;
    private final int cpuThreadNum = 1;
    private final String cpuPowerMode = "LITE_POWER_HIGH";
    private final int detLongSize = 960;
    private final float scoreThreshold = 0.1f;

    // 检测
    protected int run_det = 1;
    // 分类
    protected int run_cls = 1;
    // 识别
    protected int run_rec = 1;

    private final String assetModelDirPath = "ocr";
//    private final String assetlabelFilePath = "ocr/ppocr_keys_v1.txt";
    private final String assetlabelFilePath = "ocr";

    private final Context mContext;
    private final Predictor mPredictor;

    public OCRApi(final Context mContext) {
        this.mPredictor = new Predictor();
        this.mContext = mContext;
        boolean flag = this.mPredictor.init(mContext, assetModelDirPath, assetlabelFilePath, useOpencl, cpuThreadNum,
                cpuPowerMode,
                detLongSize, scoreThreshold);
        if (!flag){
            Log.d("*************","初始化失败");
        } else {
            Log.d("*************","初始化成功");
        }
    }

    public void end() {
        this.mPredictor.releaseModel();
    }

    public String ocrFile(final String imagePath) {
        File file = new File(imagePath);
        Log.d("****************", imagePath);
        try {
            ExifInterface exif = null;
            exif = new ExifInterface(imagePath);
            int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION,
                    ExifInterface.ORIENTATION_UNDEFINED);
            Bitmap image = BitmapFactory.decodeFile(imagePath);
            image = Utils.rotateBitmap(image, orientation);

            this.mPredictor.setInputImage(image);
            boolean flag = this.mPredictor.runModel(run_det, run_cls, run_rec);
            if (!flag){
                Log.d("****************", "无法运行!");
                return "";
            }
//            return this.mPredictor.outputResultList;
            return JSONObject.toJSONString(this.mPredictor.outputResultList);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "";
    }

    public String ocrBitmap(Bitmap bitmap){
        this.mPredictor.setInputImage(bitmap);
        boolean flag = this.mPredictor.runModel(run_det, run_cls, run_rec);
        if (!flag){
            Log.d("****************", "无法运行!");
            return "";
        }
        return JSONObject.toJSONString(this.mPredictor.outputResultList);
    }

}

11、在新建index.js中编写api

module.exports = function (plugin) {

    function Ocr(){
        this.api = plugin.createApi()
    }

    Ocr.prototype.ocrFile = function(path){
        return this.api.ocrFile(path);
    }

    Ocr.prototype.ocrBitmap = function(bitmap){
            return this.api.ocrBitmap(bitmap);
    }

    Ocr.prototype.end = function(){
        return this.api.end();
    }

    return Ocr;
}

12、打包插件

执行:Build->Build Bundle(s)/APKS->Build APK(S)

 一个10M以下的插件就完成了,然后安装到手机中。

 13、在auto.js Pro应用中编写js代码

// ***************************************************************************
// ***************加入群【754442166、469843332】可获取最新版本!!!************
// ***************************************************************************


let OCR = $plugins.load('com.tomato.ocr');
let ocr = new OCR();


let result = ocr.ocrFile("/storage/emulated/0/0.jpg");
console.log(result);

点击运行后,在日志中可以看到识别结果。

完毕!!! 

总结

        相对来说,在熟悉PaddleOCR和Android开发的情况下,进行auto.js Pro插件开发还是比较容易的,而且通过自己开发插件的形式可以集成更多的功能,比如只进行文本检测、其他语言识别模型、身份识别模型等等,相对来说比较自由,这是官方提供不了的。今天就分享到这里,感谢支持!

插件下载地址:基于PaddleOCR开发Auto.js Pro文字识别插件

 插件下载地址:基于PaddleOCR开发Auto.js 4-8文字识别插件

下面的插件支持autojs4、autojs9、autoxjs等其他基于autojs魔改版,采用最新的识别模型,优化小图识别,插件目前只支持中英文和日文,如有需要可直接私信。

  • 25
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 41
    评论
包括软件及打包apk插件 ------------------------ Auto.js使用JavaScript作为脚本语言,目前使用Rhino 1.7.7.2作为脚本引擎,支持ES5与部分ES6特性。 因为Auto.js是基于JavaScript的,学习Auto.js的API之前建议先学习JavaScript的基本语法和内置对象,可以使用教程前面的两个JavaScript教程链接来学习。 如果您想要使用TypeScript来开发,目前已经有开发者公布了一个可以把使用TypeScript进行Auto.js开发的工具,参见Auto.js DevTools。 如果想要在电脑而不是手机上开发Auto.js,可以使用VS Code以及相应的Auto.js插件使得在电脑上编辑的脚本能推送到手机运行,参见Auto.js-VSCode-Extension。 本文档的章节大致上是以模块来分的,总体上可以分成"自动操作"类模块(控件操作、触摸模拟、按键模拟等)和其他类模块(设备、应用、界面等)。 "自动操作"的部分又可以大致分为基于控件和基于坐标的操作。基于坐标的操作是传统按键精灵、触摸精灵等脚本软件采用的方式,通过屏幕坐标来点击、长按指定位置模拟操作,从而到达目的。例如click(100, 200), press(100, 200, 500)等。这种方式在游戏类脚本中比较有可行性,结合找图找色、坐标放缩功能也能达到较好的兼容性。但是,这种方式对一般软件脚本却难以达到想要的效果,而且这种方式需要安卓7.0版本以上或者root权限才能执行。所以对于一般软件脚本(例如批量添加联系人、自动提取短信验证码等等),我们采用基于控件的模拟操作方式,结合通知事情、按键事情等达成更好的工作流。这些部分的文档参见基于控件的操作和基于坐标的操作。 其他部分主要包括: app: 应用。启动应用,卸载应用,使用应用查看、编辑文件、访问网页,发送应用间广播等。 console: 控制台。记录运行的日志、错误、信息等。 device: 设备。获取设备屏幕宽高、系统版本等信息,控制设备音量、亮度等。 engines: 脚本引擎。用于启动其他脚本。 events: 事件与监听。按键监听,通知监听,触摸监听等。 floaty: 悬浮窗。用于显示自定义的悬浮窗。 files: 文件系统。文件创建、获取信息、读写。 http: HTTP。发送HTTP请求,例如GET, POST等。 images, colors: 图片和图色处理。截图,剪切图片,找图找色,读取保存图片等。 keys: 按键模拟。比如音量键、Home键模拟等。 shell: Shell命令。 threads: 多线程支持。 ui: UI界面。用于显示自定义的UI界面,和用户交互。 除此之外,Auto.js内置了对Promise。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

番茄小能手

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值