(三)从OpenCV微信识别到安卓部署使用:安卓引入并且运行

(三)从OpenCV微信识别到安卓部署使用:安卓引入并且运行_第1张图片

背景

阅读本系列文章,将会学到如何下载opencv的源码,进行编译,使得安卓项目能使用,并且实现微信二维码识别的功能。

开发环境

win11
as4+
gralde7+
kotlin 1.7.10
opencv 4.5+
cmake 3.24+
jdk11

在阅读文章前,博主默认你是已经掌握了安卓开发的相关技能,并且了解sdk和ndk的配置和下载,这里不再重复啰嗦。即jdk+sdk+ndk+androidstudio下载完成并且跑通正常ndk项目

思考

为什么要这么复杂,去实现opencv编译?通过翻阅OpenCV官方的anroid示例代码,可以看到,是没有把微信开源的二维码识别类给编译进去的,所以如果项目中,要实现基于opencv的微信识别,那么就要开发者自行编译。

注意!!文末将会在安卓项目完整的引入OpenCV4.11.0的示例代码

开始

(1)整理项目结构

从前面的文章中,我们已经得到了编译适配安卓64位系统的OpenCV SDK了,就全部在install目录下。
(三)从OpenCV微信识别到安卓部署使用:安卓引入并且运行_第2张图片
就是这几个文件夹,如果你已经下载过官方的安卓Demo,你会发现,官方这个目录下,也是这个文件夹。
那么区别在哪里?
官方的Demo编译的是核心功能,没有编译扩展功能的,而我们的编译,是加入了拓展功能的,所以区别就是多了很多拓展功能,同样地,因为增加了很多功能,所以so的体积就大了不少,如果有包体积要求的,可以自定剪裁扩展功能。
最大的区别,就是文件夹:\java\src\org\opencv 里面,多了很多功能类,截图如下图:
(三)从OpenCV微信识别到安卓部署使用:安卓引入并且运行_第3张图片
其中wechat_qrcode这个包,就是我们需要的微信二维码识别包了。

(2)安卓项目引入编译产物

对于编译产物,核心类如下图:

(三)从OpenCV微信识别到安卓部署使用:安卓引入并且运行_第4张图片
如果实在要精简的,不要libcxx_helper也可以,因为so+官方提供的java代码,已经足以实现常见的功能了。

(3)使用微信二维码识别

对OpenCV进行初始化
 OpenCVLoader.initLocal();
通过代码,赋值识别的文件到应用缓存目录

(三)从OpenCV微信识别到安卓部署使用:安卓引入并且运行_第5张图片
核心代码如下:

    public static WeChatQRCode init(Context context) {
        String rootInSdk = context.getExternalCacheDir().getAbsolutePath() + "/";
        String zipFile = "qr_module.zip";

        String dst = rootInSdk + zipFile;
        copyAssetsOne(context, zipFile, dst);

        unZip(new File(dst), rootInSdk);
        String modeDirInSdCard = rootInSdk + "qr_module/";

        return new WeChatQRCode(modeDirInSdCard + "detect_prototxt",
                modeDirInSdCard + "detect_caffemodel",
                modeDirInSdCard + "sr_prototxt",
                modeDirInSdCard + "sr_caffemodel");
    }
外部调用识别核心代码
        List results = weChatQRCode.detectAndDecode(dstRgb, points);
        if (null != results && !results.isEmpty()) {
            Log.e(TAG, "识别的结果数量:" + results.size());
            for (int i = 0, isize = results.size(); i < isize; i++) {
                String qrCode = results.get(i);
                sb.append("qrCode[").append(i).append("]").append(qrCode).append("\r\n");
                Rect rect = Imgproc.boundingRect(points.get(i));
                Imgproc.rectangle(dstRgb, rect, scalar, 5);
                Imgproc.putText(dstRgb, qrCode, rect.tl(), 0, 1, scalar);
            }
        }

上面微信二维码识别的整体思路,就是初始化OpenCV,初始化WeChatQRCode,然后调用提供的方法进行识别,详情可以从下面的Demo中阅读源码查看。

上文就是关于安卓,如何引入编译成功后的OpenCV代码了。
这简单理解就是一个so库,一个java包下的类,通过配置好build.gradle文件,使其产生关联,那么业务侧就可以直接调用java类进行OpenCV的操作了。

要点:

这里值得一提的是,在安卓引入的过程中,需要注意jdk,sdk对应的版本是否适配,虽然目标产物so表面上没有很多与Java代码关联,但是最好是保证so编译的jdk版本,和著项目中的版本一致,这样能减少很多不必要的兼容性问题。

that’s all--------------------------------------------

focus我,gzh: 老李up野

可了解日常更多精彩消息。上文源码获取方式,回复:“安卓接入OpenCV4.11.0源码”这几个关键字,即可获得

你可能感兴趣的:((三)从OpenCV微信识别到安卓部署使用:安卓引入并且运行)