构建 Android 版本的 Opencv4.8.1 带 Contrib 模块

最近需要在 android 项目中调用 opencv 的 surf 特征提取,但 opencv 官方编译的 android sdk 是不带 contrib 模块的,而surf 特征提取模块就在其中,无奈只好自己编译了

准备工作

Opencv 4.8.1 Source code

https://github.com/opencv/opencv/releases/tag/4.8.1

Opencv_contrib 4.8.1 Source code

https://github.com/opencv/opencv_contrib/releases/tag/4.8.1

Cmake GUI 3.28

https://cmake.org/download/

NDK r26

https://dl.google.com/android/repository/android-ndk-r26-windows.zip?hl=zh-cn

JDK 1.8.0_381

jdk-8u381-windows-x64.exe

Mingw64

https://github.com/niXman/mingw-builds-binaries/releases

环境变量配置参考

手动新建变量:

ANDROID_NDK_HOME = D:\Users\trry071\AppData\Local\sdk\ndk\26.1.10909125
ANDROID_HOME = D:\Users\trry071\AppData\Local\sdk
JAVA_HOME = C:\Program Files\Java\jdk-1.8

系统 PATH 变量:

%JAVA_HOME%\bin
%ANDROID_HOME%\tools
%ANDROID_HOME%\platform-tools
%ANDROID_NDK_HOME%\prebuilt\windows-x86_64\bin
D:\Users\trry071\mingw64\bin
D:\Program Files\CMake\bin

CMAKE GUI 选项配置

ANDROID_ABI:STRING=arm64-v8a //平台类型,需手动添加
ANDROID_STL_TYPE:STRING=c++_static //使用静态 C++ 标准库,需手动添加
ANDROID_TOOLCHAIN:STRING=clang //需手动添加此
BUILD_ANDROID_EXAMPLES:BOOL=OFF //不需要 Android 例子
BUILD_ANDROID_PROJECTS:BOOL=OFF //不需要编译 APK 文件
BUILD_TESTS:BOOL=OFF
BUILD_PERF_TESTS:BOOL=OFF
OPENCV_ENABLE_NONFREE:BOOL=ON
OPENCV_EXTRA_MODULES_PATH:PATH=D:/test/opencv-4.8.1/opencv_contrib-4.8.1/modules
BUILD_opencv_world:BOOL=OFF //不将各个模块编译成单个 so 或 a 文件,默认是 OFF
WITH_OPENCL=ON //OpenCL 是一种跨平台的开放标准,用于并行计算
WITH_OPENCL_SVM=ON //SVM 支持允许 OpenCL 内核共享虚拟内存,从而提高性能。
OPENCV_DISABLE_FILESYSTEM_SUPPORT=ON //禁用文件系统支持

结合上面的配置,下面两个选项中二选一

编译动态库(.so)

BUILD_FAT_JAVA_LIB:BOOL=OFF //只有在编译静态库的时候需要启用
BUILD_SHARED_LIBS:BOOL=ON //编译为动态库

编译静态库(.a)

BUILD_FAT_JAVA_LIB:BOOL=ON
BUILD_SHARED_LIBS:BOOL=OFF //编译为静态库

编译示例

打开cmake gui 程序,设置 opencv 源码路径和 build 路径,如果 build 目录不存在,cmake 将会自动创建。添加或修改 cmake gui 选项,前面已经列出来要修改或添加的选项了(点击界面上的 “Add Entry” 添加选项),在这里我设置为编译动态库,配置完毕后依次点击 “configure”,“generate”,确保过程中没有输出任何错误,警告可忽略,要不然后续步骤无法进行

进入 build 目录,在此处打开 cmd 命令行窗口或 git bash,输入 make ,回车开始编译,如下图

耐心等待,编译过程大约需要半小时。编译完成后输入 make install 将动态库安装到当前目录下的 install 目录,可以看到,各个模块的动态 so 库都在这

完结撒花~

一些提示

也许你会发现编译出来的 so 库体积明显比 opencv 官方提供的 android sdk 中的 so 库体积还要大,这是因为 so 库中包含了 debug 符号信息之类的,我猜测是用于后期调试时可步入到 opencv 库函数中去。为了缩小体积,我们可以使用 ndk 自带的 llvm-strip.exe 工具剔除掉 debug 符号信息,方法如下:

在 so 文件处打开命令行窗口,执行 D:/Users/trry071/AppData/Local/sdk/ndk/26.1.10909125/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-strip.exe *.so

我这里用的 git bash 执行,因为它可以支持 *.so,也就是匹配所有 so 文件,要不然一个个剔除很麻烦。另外,此命令也可以对静态库操作哦。

如果你还需要编译 opencv 官方的 android 例子,那么会复杂一些,会使用到 ndk r21 版本,以及 Ant 的配置等等… 本文中的 ndk r26 并不适合,因为 ndk r26 缺少了一些必要的工具。

参考文章:

https://homanhuang.medium.com/android-opencv-part-8-diy-sdk-contrib-modules-on-windows-7d7e618402fc

https://docs.opencv.org/4.x/db/d05/tutorial_config_reference.html#tutorial_config_reference_general_static

https://github.com/Mainvooid/opencv-android-sdk-with-contrib/wiki/build-opencv3.4.1-android-sdk-contrib-on-windows

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注