在Android端集成OpenCV的三种方式
创始人
2024-04-29 11:05:51

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库进行图像灰度显示

实现步骤:

  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使之在页面显示。

(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进行调用。

 

 

(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最新的功能

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

相关内容

热门资讯

苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
如何吸引顾客 怎样吸引顾客加入... 如何激活群的顾客活跃度,是商家在运营过程中绕不开的事情。当新用户来到商家的私域流量群时,商家一般会采...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
地铁怎么买票 乘坐地铁如何买票 目前,上海轨道交通全网络运营里程已增至831公里,线路增至20条,与此同时,轨道交通的支付方式也日益...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...