将 OpenCV 打包为 Android AAR

OpenCV(http://www.opencv.org)在 8 月 3 号发布了新版本 OpenCV 3.3,距离上个版本近十个月时间,现在还可以说 OpenCV 3.3 发布不久吧。将 OpenCV 打包编译为 AAR 可以将库与 APP 模块分离重用,不需要机器安装 OpenCV 库程序,也方便 OpenCV 版本跟进。

首先需要在一个 Project 里创建一个 Module,选择 Android Library 如上图所示。在弹出的对话框里 “Application/Library name” 和 “Module name” 都输入 “OpenCV”。该库还带有 AIDL 及 JNI 部分,因此还需要创建相应的文件夹,右键 OpenCV Module 选择 New -> Folder -> AIDL Folder 还有 New -> Folder -> JNI Folder。这样就创建好了 OpenCV Module。

接下来是导入代码和库,在 OpenCV 官方 Release 页面里(http://opencv.org/releases.html)下载并解压 opencv-3.3.0-android-sdk.zip。然后导入下面部分,其中 [OpenCV-android-sdk] 是 opencv-3.3.0-android-sdk.zip 解压后的路径,[OpenCV Module] 是指 OpenCV Module 的路径。

  • AIDL,作为本地库不需要 AIDL,这个操作是为了顺利编译 AAR。
    源文件:[OpenCV-android-sdk]\sdk\java\src\org\opencv\engine\OpenCVEngineInterface.aidl
    复制到:[OpenCV Module]\src\main\aidl\org\opencv\engine\OpenCVEngineInterface.aidl

  • JAVA 代码
    文件夹:[OpenCV-android-sdk]\sdk\java\src\
    复制到:[OpenCV Module]\src\main\java\

  • JNI 库
    文件夹:[OpenCV-android-sdk]\sdk\native\libs\
    选择:arm64-v8a,armeabi-v7a,armeabi(可选,这个比较旧了大部分的实现是走软件模式)
    复制到:[OpenCV Module]\src\main\jniLibs\

  • 资源文件
    源文件:[OpenCV-android-sdk]\sdk\java\res\values\attrs.xml
    复制到:[OpenCV Module]\src\main\res\values\attrs.xml

导入完成后,OpenCV Module 看起来会像是下图这样,该模块编译时便会生成 AAR 库文件。

导入 OpenCV 代码和库

使用这个 OpenCV Module 很简单在 APP 中添加 Module dependcy (模块依赖)如下图所示,弹出的框中选择 :OpenCV。如果其他 Project 里使用 OpenCV Module 则先导入模块 File -> New -> Import Module…
依赖 OpenCV 模块

下面用一个简单的 Demo App 验证来 OpenCV AAR 模块,模块将会随着 APP 一同编译生成 AAR,最终生成的 APK 里文件里会带有 JNI 库文件。下图是对 Demo APK 文件的分析

APK

Demo 使用官方例子的一段代码(有修改),这是对摄像头视频画面中间区域打马赛克

@Override
public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
Mat rgba = inputFrame.rgba();
Size sizeRgba = rgba.size();

int rows = (int) sizeRgba.height;
int cols = (int) sizeRgba.width;

int left = cols / 8;
int top = rows / 8;

int width = cols * 3 / 4;
int height = rows * 3 / 4;

Mat rgbaInnerWindow = rgba.submat(top, top + height, left, left + width);
Imgproc.resize(rgbaInnerWindow, mIntermediateMat, mSize0, 0.05, 0.05, Imgproc.INTER_NEAREST);
Imgproc.resize(mIntermediateMat, rgbaInnerWindow, rgbaInnerWindow.size(), 0., 0., Imgproc.INTER_NEAREST);
rgbaInnerWindow.release();

return rgba;
}

运行时可以看到加载 OpenCV 3.3 一些调试信息,如下图

加载 OpenCV

Demo 的效果是这样的(一点亮丽,一点羞涩)。本文使用的开发环境是:Android Studio 2.3.3

OpenCV 视频帧打码

最近更新 2017-08-30