前言
虽然opencv已经有编译好的android sdk了,但是如果要用opencv_contrib里面的模块的话,肯定得自己编译了。但是其实也不难,因为opencv已经为用户准备了编译android sdk的python脚本文件(build_sdk.py)了,只需要搭建好合适的环境,改一些参数就可以生成我们想要的动态库或者静态库文件了。
我在编译的时候,参考了这篇博客:Compile opencv+opencv_contrib lib for Android,感谢博主。
正文
(1)我的环境
-
系统环境
Linux环境: VirtualBox6.0 + Ubuntu18.0.4
java环境:Linux安装java
python: Linux Python安装 -
opencv&Android
opencv4.1.0 + opencv4.1.0_contrib: GitHub上都有,直接clone下来即可
android sdk tools 的版本要用25.2.5,链接地址:sdk/tools,文件下载下来后放入sdk目录下替换之前的tools文件
android ndk r18c: Android NDK Download(因为我看到opencv4.1.0/platforms/android里有配置文件,名称带有ndk-18的字样) -
一些必要的工具
-
re2c : sudo apt-get install re2c
ninja-build : sudo apt-get install ninja-build
libcurl4-openssl-dev: sudo apt-get install libcurl4-openssl-dev
libgtk2.0-dev: sudo apt-get install libgtk2.0-dev
pkg-config: sudo apt-get install pkg-config
(2)步骤
我的目录结构:
opencv_build
–build
–opencv-4.1.0
–opencv_contrib-4.1.0
其中,build作为最后生成的文件存放地。环境变量需要设置的有:NDK_PATH、SDK_PATH,两者分别指示Android ndk和sdk所在位置。最好直接在/etc/profile文件中设置,编译时也在超级用户下,可以省去一些不必要的麻烦。
build_sdk.py脚本文件中的参数如下:
命令:在opencv4.1.0/platforms/android下执行,
python build_sdk.py --ndk_path NDK_PATH --sdk_path SDK_PATH --extra_modules_path ~/opencv_build/opencv_contrib-4.1.0/modules
/opencv_build/build ../..
解释:前三个参数分别是ndk、android sdk和opencv_contrib的modules地址,参数’/opencv_build/build’是work_dir,也就是文件存放地,
最后一个参数’…/…’,自然就是回退到opencv4.1.0/目录下,也就是opencv_dir参数。
记录一下编译时改变的一些值:
-
android-ndk/build/cmake/android.toolchain.cmake 第112行中,将gcc改为clang
-
opencv-4.1.0/platforms/android/build_sdk.py 第113行,使用ANDROID_STL=“c++_shared"或"c++_static”,这里之前用了一个废弃的参数。编译时会报错
-
opencv-4.1.0/CMakeLists.txt 第429行,将BUILD_ANDROID_PROJECTS由ON改为OFF(设置为ON似乎是会生成apk包,生成过程中有诸多错误,本来也不用apk包,所以直接设为OFF)。
-
opencv-4.1.0/CMakeLists.txt 第426行,设置BUILD_SHARED_LIBS为ON来生成动态库(不改的话生成的是静态库)
-
这部分其实有挺多参数的,可以根据自己的需要进行更改。
-
编译的命令可以加上–no_ccache,不过不加也不会怎样,就是会报错,但程序还是可以正常进行下去
(3)后记
以上步骤写得粗糙,主要是参照开头说的博客,根据某些版本的不同会有一些更改,主要是看编译时报的错误来修改的。