在Android端集成OpenCV的三种方式

1.Opencv Android SDK

基于Opencv C++本地代码,通过Java语言接口使用JNI技术调用C++本地方法的SDK开发包。

在Android端集成OpenCV的三种方式_第1张图片

(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

在Android端集成OpenCV的三种方式_第2张图片

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版本

在Android端集成OpenCV的三种方式_第3张图片

一个小例子:点击按钮实现Java调用opencv库进行图像灰度显示

实现步骤:

在Android端集成OpenCV的三种方式_第4张图片

  1. 新建一个Android项目
  2. 导入Opencv Android SDK   (file-new-import moudle-Opencv-android-sdk/sdk)
  3. 添加Opencv android sdk依赖项到库文件  (file-project structure-Dependencies + moudle implementation-Opencv-android-sdk)
  4. 修改Gradle文件使之相关参数保持一致。   (项目中的build.gradle和Opencvm android sdk中的build.gradle)
  5. 在Layout文件activity_main.xml中添加布局,控件
  6. 在MainActivity.java实现Opencv图像处理功能  
    • import opencv相关函数功能  
    • 加载Opencv本地库  
    • 为按钮添加监听事件  
    • 实现Bitmap到Mat的转换,使用opencv函数实现对Mat的处理,最终将Mat再转换为Bitmap使之在页面显示。

在Android端集成OpenCV的三种方式_第5张图片

在Android端集成OpenCV的三种方式_第6张图片

(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做以下修改:
  1. 添加set(OpenCV_DIR ${CMAKE_SOURCE_DIR}/opencv341/sdk/native/jni)
  2. 添加find_package(OpenCV REQUIRED core imgproc highgui ximgproc photo)
  3.  在target_link_libraries里添加${OpenCV_LIBS}
  • 在Layout文件activity_main.xml添加相关的布局和控件
  • 在MainActivity.java中添加按钮监听事件,在监听事件 里添加native方法并自动在native-lib.cpp中生成该函数
  • 在native-lib.cpp中实现图像处理功能并返回图像显示, 使用JNI进行调用。

在Android端集成OpenCV的三种方式_第7张图片

 在Android端集成OpenCV的三种方式_第8张图片

 

(3)将OpenCV的源码重新编译成Android SDK库。

编译所需配置:

  1. JDK
  2. Android-sdk
  3. Apache-ant
  4. Android-ndk
  5. cmake:生成Makefile
  6. mingw:使用mingw编译
  7. opencv源码
  8. opencv_contrib源码

好处:可以获取到opencv最新的功能

缺点:编译较为复杂,且新的代码或许会存在不兼容与错误。 

你可能感兴趣的:(Android端开发实践,android,opencv,人工智能)