【转载】如何从源码编译OpenCV4Android库原⽂摘⾃知乎⽹友的⽂章
⽬录
0.前⾔
OpenCV3.1时代开始,Android平台就已经有官⽅提供的库了,理论上我们是不需要再⾃⾏编译的。⽽且OpenCV的官⽅建议也是直接使⽤OpenCV4Android库(也就是预编译的libopencv_java3.so),并提供了两套使⽤⽅法:
利⽤OpenCV提供的全套Java接⼝, 在Android Java层调⽤。
利⽤OpenCV提供的C/C++ 接⼝, 在JNI层使⽤(就跟在PC端VC++下使⽤OpenCV⼀样⼀样的)。
但是由于在实际的应⽤中难免会遇到⼀些问题,⽐如在Android⼯程中如果要同时使⽤SNPE(⼀个⾼性能神经⽹络加速库)和OpenCV 时,由于SNPE使⽤的STL链接的是libc++,⽽OpenCV默认使⽤的是gnu_stl,所以会导致gradle不管怎么配置都⽆法正常编译过的情况。
这种情况下如果gradle中选择 arguments '-DANDROID_STL=c++_shared'的话SNPE可以正常编译,但是在使⽤像 imwrite这样的OpenCV函数时就会报链接错误。相反如果gradle中选择 arguments '-DANDROID_STL=gnu_stl'则SNPE⽆法编译通过。
另外⼀⽅⾯,官⽅预编译好的OpenCV4Android库是不带contrib模块的,所以⽆法使⽤像是`xfeatures2d`这样的类。
以上原因驱使我们需要能够⾃⼰从源码编译OpenCV4Android的库。编译⽅法有⼏种,可以在Linux下基于NDK编译,也可以在Windows 中使⽤MinGW编译,本⽂选择的是前者,因为可以⽣成Docker镜像⽅便以后部署编译环境。
1.使⽤现成Dock编译镜像
这⾥使⽤的是我已经配置好的编译镜像,由于镜像⽂件尺⼨很⼤(10GB左右),所以就不上传了,⼤家可以看完这⼀节的⽅法后根据下⼀节的教程⾃⼰⽣成⼀样的镜像。(这⾥就假设⼤家已经会使⽤Docker啦,话说Docker 这种神器早⽤早享受啊~)
Docker镜像环境配置如下:
镜像名称: opencv4android-builder.image
系统版本: Ubuntu 16.04
内部OpenCV版本: 3.4.8
启动Docker的命令如下:
docker run -it --name opencv4android-builder  --network host \
-v /home/pengzhihui/_share/OpenCV:/workspace/_share/OpenCV \
-v /etc/timezone:/etc/timezone \
-v /etc/localtime:/etc/localtime \
opencv4android-builder.image
进⼊Docker容器之后⾸先设置⼀下环境变量:
export ANDROID_NDK=/workspace/opencv4android/tools/ndk/android-ndk-r17
export PATH=${PATH}:$ANDROID_NDK
export ANDROID_SDK=/workspace/opencv4android/tools/sdk/android-sdk-linux
export PATH=$ANDROID_SDK/tools:$PATH
export JAVA_HOME=/workspace/opencv4android/tools/jdk/jdk1.8.0_221
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
source  ~/.bashrc
如果需要修改NDK或者SDK等的版本则也需要更新这些环境变量。
然后进⼊⽬录/workspace/opencv4android/build,运⾏下⾯的脚本即可开始编译:
python ../opencv/platforms/android/build_sdk.py \
--extra_modules_path=/workspace/_net/opencv_contrib/modules/ \
--config ../opencv/platforms/fig.py
如需要修改编译选项,则可以修改 opencv\platforms\ake⽂件。
2.从头开始搭建编译环境
这⼀节会介绍如何从头开始搭建上⾯的镜像环境,整个过程踩了很多坑,所以这⾥记录下来。2.1 ⽣成Docker基础容器
使⽤的基础镜像为Ubuntu16.04,因此如果本地没有这个镜像的话,需要先从⽹上pull⼀下:sudo docker pull ubuntu:16.04
然后⽣成容器:
docker run -it --name opencv4android-builder-tmp  --network host \
-v /home/pengzhihui/_share/OpenCV:/workspace/_share/OpenCV \
-v /etc/timezone:/etc/timezone \
-v /etc/localtime:/etc/localtime \
ubuntu:16.04
进⼊容器之后先建⽴在/worksapce/opencv4android⼯作⽬录(名字你⾃⼰定):
mkdir /worksapce/opencv4android && cd /worksapce/opencv4android
再根据需要建⽴如下结构的⼏个⽬录(有的⽬录是后⾯下载过程产⽣的):
接下来需要安装⼀些基础⼯具:
先安装vim/nano编辑器⽤来更新源:
apt update apt install vim
vim /etc/apt/sources.list
把源更新为阿⾥源并保存:
因为纯净的ubuntu Docker镜像是不带任何⽂本编辑器的,当然了如果你喜欢⽤cat命令那也可以直接操作。
deb mirrors.aliyun/ubuntu/ xenial main
deb-src mirrors.aliyun/ubuntu/ xenial main
deb mirrors.aliyun/ubuntu/ xenial-updates main
deb-src mirrors.aliyun/ubuntu/ xenial-updates main
deb mirrors.aliyun/ubuntu/ xenial universe
deb-src mirrors.aliyun/ubuntu/ xenial universe
deb mirrors.aliyun/ubuntu/ xenial-updates universe
deb-src mirrors.aliyun/ubuntu/ xenial-updates universe
deb mirrors.aliyun/ubuntu/ xenial-security main
deb-src mirrors.aliyun/ubuntu/ xenial-security main
deb mirrors.aliyun/ubuntu/ xenial-security universe
deb-src mirrors.aliyun/ubuntu/ xenial-security universe
再次执⾏apt update即可。
安装zip/unzip⼯具
apt install zip unzip
安uild⼯具链
apt install build-essential
安装Python2.7
apt install python
安装wget
apt install wget
安装git
apt install git
安装pip
apt install python-pip
安装ninja
pip install ninja
安装ant
apt install ant
编译Java代码需要⽤到ant或者gradle,但是我因为是在服务器上进⾏编译,没有x11环境,也没装Android Studio,所以这⾥使⽤ant编译Java。
2.2 编译安装Cmake
如果直接使⽤apt安装cmake的话,得到的版本会过低(我这⾥是3.5),⽽编译OpenCV源码要求的Cmake最低版本是3.6,因此需要从源码编译安装⼀下。
另⼀⽅⾯,如果所⽤的cmake版本没有⽀持HTTPS,则编译OpenCV过程中会报 Download failed: 1;"unsupported protocol"错误,导致编译过程中的⼀些⽂件⽆法下载,因此务必安装下⾯的⽅法安装Cmake。
下载Cmake3.9.0的源码并编译:
wget --no-check-certificate /files/v3.9/cmake-3.9.
tar -zxvf cmake-3.9.
cd cmake-3.9.0
apt-get install libcurl4-gnutls-dev
apt-get install zlib1g-dev
./bootstrap --system-curl
make && make install
⼤概需要10分钟时间。
完成后检测安装是否成功:
cmake --version
2.3 安装与配置JDK环境
在下载jdk安装包,这⾥选择的是:
这⽹站很坑⾮得要登陆才能下载
然后解压:
tar -zxvf 
添加环境变量:
export JAVA_HOME=/workspace/opencv4android/tools/jdk/jdk1.8.0_221
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
source  ~/.bashrc
这⾥配置的环境变量会在重启后失效,需要在进⼊docker时重新配置,可以参考第⼀节中的脚本。(我也不想把环境变量写死以防后⾯需要更新各种SDK版本)。
运⾏下⾯的命令检查JDK是否配置成功:
java -version
2.4 安装与配置Android SDK
(个⼈:Android Studio⾥SDK Manager会⾃⾏管理SDK包的下载和安装,是否需要⾃⾏安装?)
在下载Android SDK的安装包,这⾥选择的是android-sdk_r24.。
将压缩包放置到tools/sdk⽂件夹并解压:
tar -zvxf android-sdk_r24.4.1-linux.tar
配置环境变量:
export ANDROID_SDK=/workspace/opencv4android/tools/sdk/android-sdk-linux
export PATH=$ANDROID_SDK/tools:$PATH
source  ~/.bashrc
运⾏下⾯的命令检查Android SDK是否配置成功:
android -h
运⾏下⾯的命令查看安装选项的序列号 :
android list sdk --allubuntu怎么安装python
按序列号安装需要的组件和sdk包:
这⾥安装以下内容:
24- Android SDK Build-tools, revision 24.0.1
54- SDK Platform Android 7.0, API 24, revision 2
android update sdk -u --all --filter  24,54
然后运⾏下⾯的命令安装Android SDK Platform-tools:
这条命令作⽤是安装所有包,但是这⾥不需要这么多包,等看到它安装完 Android SDK Platform-tools后就可以ctrl-c终⽌了。android update sdk --no-ui
2.5 下载OpenCV源码和contrib库
运⾏下⾯的命令克隆opencv源码:
git clone github/opencv/opencv.git
cd opencv && git checkout 3.4
下载opencv的扩展库:
git clone github/opencv/opencv_contrib.git
cd opencv_contrib && git checkout 3.4

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。