更新记录

1.2.0(2021-06-07)

1.支持配置生成带标记框的图片,并保存到相册,示例项目可展示;

1.1.0(2021-06-04)

1.1.0 更新模型参数动态传入;修复示例项目调用插件名称

1.0.0(2021-06-03)

1.首次发布

查看更多

平台兼容性

Android Android CPU类型 iOS
适用版本区间:7.0 - 11.0 armeabi-v7a:支持,arm64-v8a:支持,x86:未测试 ×

原生插件通用使用流程:

  1. 购买插件,选择该插件绑定的项目。
  2. 在HBuilderX里找到项目,在manifest的app原生插件配置中勾选模块,如需要填写参数则参考插件作者的文档添加。
  3. 根据插件作者的提供的文档开发代码,在代码中引用插件,调用插件功能。
  4. 打包自定义基座,选择插件,得到自定义基座,然后运行时选择自定义基座,进行log输出测试。
  5. 开发完毕后正式云打包

付费原生插件目前不支持离线打包。
Android 离线打包原生插件另见文档 https://nativesupport.dcloud.net.cn/NativePlugin/offline_package/android
iOS 离线打包原生插件另见文档 https://nativesupport.dcloud.net.cn/NativePlugin/offline_package/ios

注意事项:使用HBuilderX2.7.14以下版本,如果同一插件且同一appid下购买并绑定了多个包名,提交云打包界面提示包名绑定不一致时,需要在HBuilderX项目中manifest.json->“App原生插件配置”->”云端插件“列表中删除该插件重新选择


DetectionModule

uni-app yolov5转换为ncnn的模型部署到安卓,转为uniapp调用; 1.将示例项目和插件包下载下来,将插件解压后放在 示例项目/nativeplugins目录下; 2.配置manifest.json -> app原生插件配置 ->选择本地插件 ,如果您放对位置此时应该有CW-DetectionModule,选择他,确定; 3.在您的代码中 引入插件var testModule = uni.requireNativePlugin("DetectionModule"); 4.接下来的错做,就可以参照下面代码完成调用;

更换模型及参数

如果你有自定义使用场景,该插件可支持更换模型,修改初始化参数来适应新的模型; a). 替换掉插件包里面的android/assets/yolov5s.pt这两个模型文件(注:模型必须按照yolov5的标准,又腾讯的ncnn转换模型); b).更换模型文件后,模型的输入输出参数需要调整,detecteAsyncFunc第一个参数作为参数列表传入插件,可以初始化模型参数; c).有问题 联系QQ:670432835

使用方式:

<script>
// 获取 module
// var testModule
// var modal
var testModule = uni.requireNativePlugin('CW-DetectionModule');
const modal = uni.requireNativePlugin('modal');
export default {
    onLoad() {},
    data() {
        return {
            imgSrc:'',
            imgList: [],
            deceteList: [],
            startTime: 0,
            yolov5IsLoad:false,
            deceteLoading: false, 
            initYoloLoading: false, 
            //初始化模型参数
            initOpt:{
                initParams:{
                    stride8OutName: 'output', // stride8输出节点名称
                    stride16OutName: '781', // stride16输出节点名称
                    stride32OutName: '801', // stride32输出节点名称
                    inputName: 'images', // 输入节点
                    imgSize: 640, // 调节图片尺寸
                    probThreshold: 0.25, // 置信度阈值,超过这个值才会被标记
                    nmsThreshold: 0.45
                },
                deviceParams:{ //识别时配置的相关参数
                    isGpu: false,  //为false时使用CPU,为true使用GPU
                    showImg: true, //是否生成指示框的图片 -- 只有指定生成图片 下面属性才会生效
                    isCoverImg: true, //是否删除原图
                    imgSaveDir: 'decete', //识别后生成带标记图片的保存在 根目录/decete 下,可自定义目录
                    flushAlbum: true, // 生成后是否需要刷新相册,如果识别频次高,建议就不刷新了,
                },
                classify:['人','自行车','汽车','摩托车','飞机','公共汽车','火车','卡车','船','交通灯',
                        '消防栓','停车标志','停车计时器','长凳','鸟','猫','狗','马','羊','牛',
                        '大象','熊','斑马','长颈鹿','背包','雨伞','手提包','领带','手提箱','飞盘',
                        '滑雪板','滑雪板1','运动球','风筝','棒球棒','棒球手套','滑板','冲浪板',
                        '网球拍','瓶子','酒杯','杯','叉','刀','勺子','碗','香蕉','苹果',
                        '三明治','橙子','花椰菜','胡萝卜','热狗','披萨','甜甜圈','蛋糕','椅子','沙发',
                        '盆栽','床','餐桌','厕所','电视','笔记本电脑','鼠标','遥控器','键盘','手机',
                        '微波炉','烤箱','烤面包机','水槽','冰箱','书','时钟','花瓶','剪刀','泰迪熊',
                        '吹风机','牙刷']
            },
            deceteParams:{
                uri:null //指定要识别图片路径
            }
        };
    },
    methods: {
        chooseLocalImg() {
            var that = this;
            // 从相册中选择图片
            console.log('从相册中选择图片:');
            plus.gallery.pick(
                function(path) {
                    that.deceteParams.uri = path;
                    that.decete.call(that, that.deceteParams);
                    //压力测试
                    // setInterval(()=>{
                    //  that.startTime = new Date().getTime()
                    //  that.decete.call(that,opt)s
                    // },3000)
                },
                function(e) {
                    that.deceteList = [];
                    console.log('取消选择图片');
                },
                { filter: 'image' }
            );
        },
        gotoNativePage() {
            testModule.gotoNativePage();
        },
        decete(opt) {
            var that = this;
            that.deceteLoading= true
            // 调用异步方法
            testModule.detecteAsyncFunc(opt, ret => {
                // console.log("本地识别耗费时间为:" + (new Date().getTime() -that.startTime) )
                if (ret.data) {
                    // 拿到识别出来的结果结果示例:
                    /* {code:'success',
                        data:[{label:'person' //类型,prob:'0.58’,//置信度, h:58//区域高, w:58//区域宽, x:0//图片横坐标,y:0//图片纵坐标},
                        path:'生成图片的位置']
                    } */
                    that.deceteList = JSON.parse(ret.data);
                    that.imgSrc = ret.path;
                    console.log(ret.path)
                    that.deceteLoading= false
                }
                console.log(ret);
            });
        },
        initYolov5(){
            var that = this;
            that.initYoloLoading = true
            // 调用异步方法
            testModule.initModel(that.initOpt, ret => {
                // console.log("本地识别耗费时间为:" + (new Date().getTime() -that.startTime) )
                if (ret.data == "success") {
                    that.yolov5IsLoad = true
                }else{
                    that.yolov5IsLoad = false
                }
                that.initYoloLoading = false
                console.log(ret);
            });
        }
    }
};
</script>

隐私、权限声明

1. 本插件需要申请的系统权限列表:

"android.permission.INTERNET", "android.permission.RECORD_AUDIO", "android.permission.MODIFY_AUDIO_SETTINGS", "android.permission.ACCESS_NETWORK_STATE", "android.permission.READ_PHONE_STATE", "android.permission.CAMERA", "android.permission.WRITE_EXTERNAL_STORAGE", "android.permission.BLUETOOTH", "android.permission.WAKE_LOCK", "android.permission.READ_EXTERNAL_STORAGE"

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件不采集任何数据

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

许可协议

作者未提供license.md

使用中有什么不明白的地方,就向插件作者提问吧~ 我要提问