自Opencv3.0以来,Opencv的功能更加地模块化,一些还不够完善的功能模块目前还没有merge到主分支中,例如我们下面要说到的人脸识别模块,并不在主分支内,所以,如果我们要利用Opencv来进行人脸识别,我们还要亲自动手去编译。而网上很多的教程都是利用vs和cmake-gui进行编译,最后生成的是windows平台下的链接库,而很少有文章介绍针对Android平台的编译。下面简单介绍一下我在Ubuntu下的编译过程。
工具准备
cmake安装:
sudo apt-get install cmake
Android NDK: 版本r10d(为什么是r10d,后面会说)
Build-opencv-for-android:优快云,github,下载下来,将会利用build-android-opencv.sh这个脚本进行编译。
文件参数修改
如果同时也想编译opencv的opencl支持,可以先参考这篇文章去修改参数,《为Android平台编译支持OpenCL的Opencv静态库》
打开build-andriod-opencv.sh,修改编译的架构平台
编译
将opencv和opencv_contrib拷到build-android-opencv.sh的同级目录下。文件夹名字一定要是opencv和opencv_contrib,查看下面这个脚本的内容就知道了,当然,你也可以修改一下这个脚本,但我是选择修改文件夹名字。
./build-android-opencv.sh
坐等编译结果,如下图:
编译成功之后,找到android_opencv这个文件夹:
头文件路径:./android_opencv/opencv/sdk/native/jni/include
静态库路径:./android_opencv/opencv/sdk/native/libs/armeabi-v7a
.
├── libopencv_aruco.a
├── libopencv_bgsegm.a
├── libopencv_bioinspired.a
├── libopencv_calib3d.a
├── libopencv_ccalib.a
├── libopencv_core.a
├── libopencv_datasets.a
├── libopencv_dnn.a
├── libopencv_dpm.a
├── libopencv_face.a
├── libopencv_features2d.a
├── libopencv_flann.a
├── libopencv_fuzzy.a
├── libopencv_highgui.a
├── libopencv_imgcodecs.a
├── libopencv_imgproc.a
├── libopencv_line_descriptor.a
├── libopencv_ml.a
├── libopencv_objdetect.a
├── libopencv_optflow.a
├── libopencv_phase_unwrapping.a
├── libopencv_photo.a
├── libopencv_plot.a
├── libopencv_reg.a
├── libopencv_rgbd.a
├── libopencv_saliency.a
├── libopencv_shape.a
├── libopencv_stereo.a
├── libopencv_stitching.a
├── libopencv_structured_light.a
├── libopencv_superres.a
├── libopencv_surface_matching.a
├── libopencv_text.a
├── libopencv_tracking.a
├── libopencv_video.a
├── libopencv_videoio.a
├── libopencv_videostab.a
├── libopencv_xfeatures2d.a
├── libopencv_ximgproc.a
├── libopencv_xobjdetect.a
└── libopencv_xphoto.a
附:
这里再提供个链接给大家参考一下《opencv-contrib在cmake中出现下载错误的解决》。
打开./android-cmake/android.toolchain.cmake这个文件,找到第219行如下:
set( ANDROID_SUPPORTED_NDK_VERSIONS ${ANDROID_EXTRA_NDK_VERSIONS}
-r10d -r10c -r10b -r10 -r9d -r9c -r9b -r9 -r8e -r8d -r8c -r8b -r8 -r7c -r7b -r7 -r6b -r6 -r5c -r5b -r5 "" )当然,你可以试一下,用r10d以上版本的NDK是否能编译。