OpenCV和OpenCV_contrib模块4.5.x版本的编译
环境准备:
Ubuntu 16.04.1,环境变量:
export ANDROID_HOME=~/work/android-sdk
export ANDROID_NDK_HOME=~/work/android-sdk/ndk/20.0.5594570
export JAVA_HOME=~/software/jdk1.8.0_171
cmake 版本,这里直接使用的是SDK中的cmake:
export PATH=~/work/android-sdk/cmake/3.6.4111459/bin:$JAVA_HOME/bin:$PATH
注意
这里SDK中不能有多个cmake版本,否则可能会出现下面的莫名其妙的错误。原因就是我在SDK目录中下载了一个更新的cmake版本3.18.1,这个问题出现后删掉新版本的cmake就可以了。
SDK initialized in 0 ms
FAILURE: Build failed with an exception.
* What went wrong:
A problem occurred configuring project ':face-detection'.
> Invalid revision: 3.18.1-g262b901
* Try:
Run with --stacktrace option to get the stack trace. Run with --debug option to get more log output. Run with --scan to get full insights.
* Get more help at
在cmake配置完毕时会打印当前的配置信息,注意CMake:后面所示的版本号就是CMake build tool后面的版本。
-- General configuration for OpenCV 4.5.5 =====================================-- Version control:4.5.5-- -- Extra modules:--Location (extra): /build/master-contrib_pack-contrib-android/opencv_contrib/modules--Version control (extra):4.5.5-- -- Platform:--Timestamp: -12-25T04:26:00Z--Host: Linux 4.15.0-58-generic x86_64--Target: Android 1 armv7-a--CMake: 3.6.0-rc2--CMake generator: Ninja--CMake build tool: /opt/android/android-sdk.gradle/cmake/3.6.4111459/bin/ninja--Configuration:Release
将代码分别拉到opencv和opencv_contrib两个目录里,新建一个build目录作为编译用途。
-01-07 12:39:06:~/work/ocv $ tree -L 1.├── build├── build.txt├── opencv└── opencv_contrib3 directories, 1 file$ cmake -versioncmake version 3.6.0-rc2CMake suite maintained and supported by Kitware (/cmake).
跳转到build目录执行配置:
cmake -DOPENCV_ENABLE_NONFREE=ON -DBUILD_DOCS=OFF -DBUILD_TESTS=OFF -DANDROID_TOOLCHAIN_NAME=arm-linux-androideabi-4.9 -DWITH_OPENCL=OFF -DBUILD_PERF_TESTS=OFF -DCMAKE_TOOLCHAIN_FILE=~/work/android-sdk/ndk/20.0.5594570/build/cmake/android.toolchain.cmake -DWITH_CUDA=OFF -DANDROID_NATIVE_API_LEVEL=21 -DANDROID_TOOLCHAIN=clang -DANDROID_STL=c++_static -DANDROID_ABI=armeabi-v7a -DANDROID_ARM_NEON=ON -DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib/modules ../opencv
之后执行make -j4就可以了。等完全编译成功后执行make install 可在当前build目录生成一个install目录。
使用现成的发布版本
其实我本来就是想编译opencv_contrib扩展模块的,如果官方有发布带扩展模块的SDK,我也不会尝试着自己编译了。中间各种找,后来从官方编译日志上发现了配置编译方法。同时也发现了未发布的带扩展模块的SDK版本。
这是编译带扩展模块的编译历史列表:
Buildbot: master-contrib_pack-contrib-android
OpenCV编译机器人打包发布目录:
/buildbot/export/opencv_releases/4_x_pack-android/
我从中发现了4.5.5的配置编译历史记录:Buildbot: master-contrib_pack-contrib-android Build #11369
从中可以找到4.5.5的打包版本(这个链接在发布了更新的版本后可能会失效,但是查找新版本的方法同上):Directory listing for /export/opencv_releases/master-contrib_pack-contrib-android/1225-042541--11369/
4.5.4的配置编译历史记录:Buildbot: master-contrib_pack-contrib-android Build #11357
从上面的编辑记录里也可以看到OpenCV源码库中有一键编译打包Android版本SDK的脚本,具体执行方法:
python ../opencv/platforms/android/build_sdk.py --ndk_path $ANDROID_NDK_HOME --sdk_path $ANDROID_HOME --extra_modules_path ../opencv_contrib/modules . ../opencv
题外话
另外多说一点,在Windows上也可以使用git bash命令行编译,不需要再额外安装MSYS。亲测有效!我的系统是Windows 7。
最后贴个图吧。