2011年12月微信3.5版本正式上线“扫一扫”二维码,历经9年蜕变,“扫一扫”从二维码名片到扫码支付、从小程序码到健康码,二维码已经成为一种生活方式,连接着数字与现实。现在,在腾讯WeChatCV团队的贡献下,微信扫码引擎正式加入OpenCV开源了!号称只需要三行代码,你便轻松拥有微信的扫码能力。我只想说,真的没那么容易,我花了半天才完成微信二维码扫描引擎在Android平台上的基础实践。
前言
全网首发微信二维码引擎Android平台移植
介绍
微信扫码引擎是一款基于开源引擎ZXing,并高度优化和深度改造的高性能轻量二维码识别器。主要特点如下:
- 1. 基于CNN的二维码检测
- 2. 基于CNN的二维码增强
- 3. 更鲁棒的定位点检测
环境
- Windows10
- Android Studio 4.1.1
- NDK r19c
- CMake-GUI 3.16.0
- MinGW
- JAVA 8
- ANT 1.9.15
编译准备
1. 下载源码
由于微信二维码引擎是新增功能,直接下master分支源码编译即可
openCV源码:https://github.com/opencv/opencv
opencv_contrib源码:https://github.com/opencv/opencv_contrib
2. 安装CMake
3. 安装MinGW
建议直接用Installer傻瓜式安装,选择下列需要安装的组件,右键选择Mark for Installation
,之后选择Menu -> Installation -> Apply Changes
。
安装完后把mingw加入系统环境变量。
4. 下载JDK并安装配置JAVA
5. 下载Android SDK、NDK并配置环境变量
6. 下载ANT1.9.15
编译配置
新建一个存放编译结果的文件夹,可以名为build
。如我的源码和编译结果文件夹目录分别为:
opencv源码目录:D:\05_Project\03_AI_Project\opencv
opencv_contrib源码目录:D:\05_Project\03_AI_Project\opencv_contrib
build编译结果目录:D:\05_Project\03_AI_Project\build
1. 配置源码目录和编译结果目录
2. 添加编译参数
点击Add Entry
添加
- ANDROID_NDK 类型为PATH,填入你的NDK路径
- ANDROID_SDK PATH,填入你的SDK路径
- ANDROID_ABI STRING,设置平台,不填默认为 armeabi-v7a
- ANDROID_NATIVE_API_LEVEL STRING,默认API为21
- ANT_EXECUTABLE PATH,填入ANT路径下的bin(用于java 封装,便于 AS 导入module)
- ANDROID_STL STRING,根据需求写入c++_static或c++_shared(默认是gnustl_static)
3. 配置toolchain
点击Configure
,选择Specify toolchain file for cross-compiling
,点击Next
,选择对应NDK目录下的toolchain路径,点击Finish
。
4. 执行Configure
待Configure
过程完成,若无异常,界面应与下面结果类似。
5. 调整参数
添加opencv_contrib模块并调整参数,搜索对应参数进行调整
- OPENCV_EXTRA_MODULES_PATH,选择opencv_contrib/modules路径
- WITH_OPENCL=ON,添加移动端的并行架构支持
- WITH_OPENCL_SVM =ON,开启共享虚拟内存
6. 执行Configure和Generate
执行编译
进入build
目录,进入Git Bash
界面,执行mingw32-make.exe
命令,如果没有出现报错,则再执行 mingw32-make.exe install
编译结果
红色箭头为我们所需要的内容,jni目录下有我们需要的libopencv_java4.so
库,opencv_android目录下则是我们需要的opencv android依赖包和示例程序。
移植到Android平台
-
新建Android工程,导入
libopencv_java4.so
包 -
以模块的形式导入opencv_android目录下的
opencv
文件夹 -
下载模型文件(https://github.com/WeChatCV/opencv_3rdparty)
-
指定
abiFilters
,因为目前我们只编译了armeabi-v7a
架构ndk { abiFilters 'armeabi-v7a' }
-
编码,运行,测试
微信二维码引擎接口
构造方法
public WeChatQRCode(String detector_prototxt_path, String detector_caffe_model_path, String super_resolution_prototxt_path, String super_resolution_caffe_model_path)
四个参数分别对应:detect.prototxt,detect.caffemodel,sr.prototxt,sr.caffemodel四个文件的路径
检测并解码
public List<String> detectAndDecode(Mat img, List<Mat> points)
- 参数一:img,待检测和识别的图像
- 参数二:points,用于存放检测到的二维码的矩形坐标
- 返回值:二维码解码结果。