1.Opencv Android SDK
基于Opencv C++本地代码,通过Java语言接口使用JNI技术调用C++本地方法的SDK开发包。
(1)etc:各类模型文件存储地址
(2)java:Java版本的Android SDK相关文件
(3)native:JNI层开发所需头文件,C++编译好的Opencv Android平台支持的本地库文件,Cmake文件(*.a,*.so)。
2.环境搭建
(1)Opencv Android SDK
(2)JDK8
(3)Android studio
(4)Android SDK与NDK开发包,CMAKE
3.Android接入Opencv的三种方式
(1)接入OpenCV的Java SDK 包,直接在Java调用OpenCV方法;
- 新建Android项目
- 导入Opencv Android SDK依赖项
- 修改Gradle文件使之保持一致并编译
- 添加本地依赖项Opencv库文件,成功后在app中的build.gradle中dependencies {implementation project(path: 'sdk')}
- 在project structure中配置好ndk版本
一个小例子:点击按钮实现Java调用opencv库进行图像灰度显示
实现步骤:
- 新建一个Android项目
- 导入Opencv Android SDK (file-new-import moudle-Opencv-android-sdk/sdk)
- 添加Opencv android sdk依赖项到库文件 (file-project structure-Dependencies + moudle implementation-Opencv-android-sdk)
- 修改Gradle文件使之相关参数保持一致。 (项目中的build.gradle和Opencvm android sdk中的build.gradle)
- 在Layout文件activity_main.xml中添加布局,控件
- 在MainActivity.java实现Opencv图像处理功能
- import opencv相关函数功能
- 加载Opencv本地库
- 为按钮添加监听事件
- 实现Bitmap到Mat的转换,使用opencv函数实现对Mat的处理,最终将Mat再转换为Bitmap使之在页面显示。
(2)使用OpenCV SDK提供的C++头文件与.so动态库与.a静态库,封装JNI使用C++实现调用;
Android Studio2.2前版本NDK开发流程:
- 编写C/C++文件,创建一个java文件,声明一个自定义的native方法即java层到native层的入口
- 使用静态域将so包加载进来 使用ndk编译so包,编写Android.mk, Application.mk,在gradle中指定so库的路径,gradle会自动将so文件打包进来,在andorid闭包中添加.
Android Studio3.0后的版本NDK开发流程:
- 在SDK Tools中下载CMake、LLDB、NDK
- 创建一个新项目,并勾选Include C++ support
- 项目创建完毕会有一个c++的hello world示例, 其中cpp和External Build Files 用于放置C++源文件 和不同的ABI版本CMake脚本,将Opencv Android sdk直接放到cpp文件夹下,使用cmake实现opencv库的调用。
- 在MainActivity中添加一个native方法,然后选中, 按下alt+enter让IDE自动生成C++函数
- 在native-lib.cpp中可以看见自动生成的函数,使用JNI实现其cpp文件的调用。
一个小例子:在安卓端自建C++项目实现opencv相关图像处理功能
实现步骤:
- 创建一个新项目,并勾选Include C++ support (activity_main.xml,MainActivity.java,native-lib.cpp)
- 将opencv sdk放入app/src/main/cpp下,实现在cpp文件中使用opencv (cpp/opencv341/sdk/native/jni/include/opencv2)注:导入opencv contrib扩展库可以在网上直接下载编译好的sdk,需对cmakelist.txt做以下修改:
- 添加set(OpenCV_DIR ${CMAKE_SOURCE_DIR}/opencv341/sdk/native/jni)
- 添加find_package(OpenCV REQUIRED core imgproc highgui ximgproc photo)
- 在target_link_libraries里添加${OpenCV_LIBS}
- 在Layout文件activity_main.xml添加相关的布局和控件
- 在MainActivity.java中添加按钮监听事件,在监听事件 里添加native方法并自动在native-lib.cpp中生成该函数
- 在native-lib.cpp中实现图像处理功能并返回图像显示, 使用JNI进行调用。
(3)将OpenCV的源码重新编译成Android SDK库。
编译所需配置:
- JDK
- Android-sdk
- Apache-ant
- Android-ndk
- cmake:生成Makefile
- mingw:使用mingw编译
- opencv源码
- opencv_contrib源码
好处:可以获取到opencv最新的功能
缺点:编译较为复杂,且新的代码或许会存在不兼容与错误。