因项目需要移植算法到Android平台,开始学习如何再移动端上使用Opencv。自己复现了opencv中的一些代码,但是执行速度不及opencv。
推荐阅读:
https://blog.csdn.net/martin20150405/article/details/53284442
1.准备好SDK环境
参照谷歌官文:https://developer.android.google.cn/studio/projects/add-native-code#link-gradle
在SDK Manager下安装好CMake\LLDB\NDK
2.创建一个新工程
3.配置OpenCV Android SDK
注意此处:不同于前面给的3篇文章,本文不需要创建jniLibs文件夹和对jniLibs的gradle设置,新的AS已经可以自动打包到apk
此文用官方编译发布的OpenCV Android SDK 3.4.1来进行演示(不含contrib库),contrib库需要自己编译,如何编译以后再写。
①opencv头文件
以我的为例,sdk下载在桌面,C:\Users\xy\Desktop\opencv-3.4.1-android-sdk\
将C:\Users\xy\Desktop\opencv-3.4.1-android-sdk\OpenCV-android-sdk\sdk\native\jni 文件夹内的include文件夹拷贝到工程C:\Users\xy\Desktop\CSDN\app\src\main\cpp目录下,这样以便C++编程时能使用OpenCV头文件
拷贝过去后对native-lib.cpp进行编辑引用头文件,尝试写个opencv语句,可以看到已经出现代码提示,如下图
当然此时还不能编译,因为还没有将opencv的库信息导入工程
②编辑CMakeLists.txt
推荐使用上面给出的2、3文章链接的方式导入opencv库信息,以我的sdk目录为例应该如下设置:
#参考 https://blog.csdn.net/u010677365/article/details/76922541
set(OpenCV_STATIC ON)#1
set(OpenCV_DIR C:/Users/xy/Desktop/opencv-3.4.1-android-sdk/OpenCV-android-sdk/sdk/native/jni)#2
find_package(OpenCV REQUIRED)#3
target_link_libraries( # Specifies the target library.
native-lib
# Links the target library to the log library
# included in the NDK.
${log-lib}
${OpenCV_LIBS}#4
)
请注意下图sdk路径分隔符号表示方式为/而不是winows的\
配置CMakeLists完成后,同步gradle,会在工程android视图下面看到,被应用的库
理论上现在就可以编译了,编译试试。如下图,
到这里我当时就懵逼了,这也就是我前面说的很简单巨坑
③NDK编译报错的解决方法
更换工程NDK设置,不要使用AndroidStudio SDK管理器里面下载的NDK工具包
替换为R14或者R16的NDK包,为什么是R14或者R16?因为最新的R17也编译不了,说多了都是泪,这就是我这几天爬的坑!!!
自带工具下载的NDK不完整编译会报各种错误,较新的其他完整包如R17也不行,估计是OpenCV源码cmake配置的问题,R14和R16我验证过没有问题请放心使用。
附上NDK下载链接 https://developer.android.google.cn/ndk/downloads/older_releases
④编译工程
成功!!!
说明下:我推荐的上面3篇文章,有提到abi版本过滤设置,请根据你的目标环境设置app下的gradle
例如,只需要armeabi-v7a,可以启用图中注释部分
abiFilters 'armeabi-v7a'
另外如果除了opencv还有其他库要引入,请考虑使用jniLibs文件夹,并配合设置gradle。具体过程可以参见开头那三篇文章。
2018.05.30 工程源码:https://download.csdn.net/download/a390641326/10446257