OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。
 
       我们利用它来做一些图片的处理,能大大的优化内存的处理。下面我来说说接下OpenCV 的三种方式:

一、接入OpenCV 的Java SDK 包,这样你可以直接在Java调用OpenCV 的大部分方法。第一种方式适用于对Opencv c++ 不熟悉的童鞋,不需要直接调用C++方案, 因为SDK 已经用JNI 全部封装好了。假设你已经安装好JDK、AndroidStudio与NDK环境。
         先到官网http://opencv.org/releases.html ,下载Android 包,如:opencv-3.2.0-android-sdk.zip。
 
sdk 目录提供了Android的API与Java 库
sdk/java 目录包含了一个 Eclipse 项目,该项目提供 OpenCV 的Java API,且可以导入到开发环境里。
sdk/native 目录包含了OpenCV C++ 头文件(用于JNI),与Android的 .so动态库 .a静态库。
sdk/etc 目录包含了Haar 与 LBP cascades 级联。
apk  目录包含了用户安装在指定的Android设备的安装文件,该文件使opencv 库可以管理opencv API
 
首先: File > New > New Module
 
然后:选择Import Eclipse ADT Project
 
把sdk/java 下的项目导入到项目里,然后把这个modules 添加到 app modules里,
直接在 app 目录下build.gradle 文件里dependencies 大括号下添加:
compile project(':openCVLibrary')
 
接着在 app/src/main 目录下 创建一个jniLibs 目录,然后把sdk/native/libs 下所有文件 拷贝到jniLibs下,编译,运行。

如果导入后,出现一些android 自带的类识别不了,那就是因为编译的SDK版本出错了。
打开 刚导入 的模块下 build.gradle 文件,把 compileSdkVersion 与 targetSdkVersion修改成你最新的SDK版本,如:

  1. apply plugin: 'com.android.library'
  2.  
  3. android {
  4. compileSdkVersion
  5. buildToolsVersion "25.0.0"
  6.  
  7. defaultConfig {
  8. minSdkVersion
  9. targetSdkVersion
  10. }
  11.  
  12. buildTypes {
  13. release {
  14. minifyEnabled false
  15. proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
  16. }
  17. }
  18. }
运行,则成功了,我发现似乎不需要再安装额外的 opencv 的apk 了。
下面链接是我添加成功的例子: 
 
二、使用opencv sdk 提供的 C++ 头文件与 .so动态库 与 .a静态库,自己封装jni,这样使用的效率会比第一种方法高一些, 且可以100%使用opencv 的接口。下面看一下安装的方式:
 
      用AndroidStudio 创建一个项目,然后在 Java 类里创建一个native 方法,
再在app/src/main 下创建 jni,然后创建 cpp 文件对于 native 方法。
以上是一个简单的jni 方法,你可以查看我以前的 文章: http://www.cnblogs.com/xiaoxiaoqingyi/p/6524165.html
在基本的jni 跑通下,我们把 opencv 库加入项目里,首先:

1、把 sdk/native 目录 拷贝到 项目的 jni 目录下,
 
然后就是配置 Android.mk文件:
  1. LOCAL_PATH:=$(call my-dir)
  2.  
  3. include $(CLEAR_VARS)
  4. OpenCV_INSTALL_MODULES := on
  5. OpenCV_CAMERA_MODULES := off
  6. OPENCV_LIB_TYPE :=STATIC
  7.  
  8. ifeq ("$(wildcard $(OPENCV_MK_PATH))","")
  9. include $(LOCAL_PATH)/native/jni/OpenCV.mk
  10. else
  11. include $(OPENCV_MK_PATH)
  12. endif
  13. LOCAL_MODULE := OpenCV
  14. LOCAL_SRC_FILES := com_magicing_eigenndk_NDKUtils.cpp
  15. LOCAL_LDLIBS += -lm -llog
  16. include $(BUILD_SHARED_LIBRARY)
接着配置 Application.mk 文件:
  1. APP_STL := gnustl_static
  2. APP_CPPFLAGS := -frtti -fexceptions
  3. APP_PLATFORM := android-
 
最后在 cpp 文件调用 opencv 的方法, 首先导入 #include <opencv2/opencv.hpp> 如:
  1. #include <jni.h>
  2. #include <string>
  3. #include <iostream>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <opencv2/opencv.hpp>
  7.  
  8. using namespace cv;
  9.  
  10. extern "C"
  11.  
  12. JNIEXPORT jintArray JNICALL Java_com_magicing_eigenndk_NDKUtils_gray(
  13. JNIEnv *env, jclass obj, jintArray buf, int w, int h) {
  14.  
  15. jint *cbuf;
  16. cbuf = env->GetIntArrayElements(buf, JNI_FALSE );
  17. if (cbuf == NULL) {
  18. return ;
  19. }
  20.  
  21. Mat imgData(h, w, CV_8UC4, (unsigned char *) cbuf);
  22.  
  23. uchar* ptr = imgData.ptr();
  24. for(int i = ; i < w*h; i ++){
  25. //计算公式:Y(亮度) = 0.299*R + 0.587*G + 0.114*B
  26. //对于一个int四字节,其彩色值存储方式为:BGRA
  27. int grayScale = (int)(ptr[*i+]*0.299 + ptr[*i+]*0.587 + ptr[*i+]*0.114);
  28. ptr[*i+] = grayScale;
  29. ptr[*i+] = grayScale;
  30. ptr[*i+] = grayScale;
  31. }
  32.  
  33. int size = w * h;
  34. jintArray result = env->NewIntArray(size);
  35. env->SetIntArrayRegion(result, , size, cbuf);
  36. env->ReleaseIntArrayElements(buf, cbuf, );
  37. return result;
  38. }
 
然后在 activity 页面里显示处理过的图片,如下:
  1. public class MainActivity extends AppCompatActivity {
  2.  
  3. @Override
  4. protected void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.activity_main);
  7. NDKUtils ndk = new NDKUtils();
  8.  
  9. Bitmap bitmap = ((BitmapDrawable) getResources().getDrawable(
  10. R.mipmap.pic_test)).getBitmap();
  11. int w = bitmap.getWidth(), h = bitmap.getHeight();
  12. int[] pix = new int[w * h];
  13. bitmap.getPixels(pix, , w, , , w, h);
  14. int [] resultPixes=ndk.gray(pix,w,h);
  15. Bitmap result = Bitmap.createBitmap(w,h, Bitmap.Config.RGB_565);
  16. result.setPixels(resultPixes, , w, , ,w, h);
  17.  
  18. ImageView img = (ImageView)findViewById(R.id.img2);
  19. img.setImageBitmap(result);
  20.  
  21. }
  22.  
  23. }

运行成功后:

我编译成功的项目链接:
https://github.com/xiaoxiaoqingyi/NDKDemos   (OpenCV_native项目)
官网参考资料:
 
三、通过opencv 的源码,重新编译成 Android sdk 库,这样的好处是能获取到最新的功能,缺点是编译有点困难(对于不懂C++/C 的童鞋),且新的代码或许会存在不兼容与错误。
 
     以上的链接是官网推荐的编译过程,我也尝试过编译成功,如果在windows 下安装Cygwin,然后来编译是通过不了的,需要重新安装cmake、shell 以及其它的软件,编译的过程确实复杂很多。
     我是在MAC下编译的,只需安装 cmake软件,当然也要有NDK的环境。大概的步骤:
https://github.com/opencv/opencv 下载opencv 源码包
 
1、在mac 下安装好 cmake 软件,
2、配置NDK环境变量, 参考百度:http://jingyan.baidu.com/article/d2b1d1029c1ea65c7e37d4c9.html
3、build_android_arm/install 目录下 得到编译好的jni 目录。
 
     如果你想编译 opencv_contrib 也就是 opencv extra库的话,你需要把https://github.com/Itseez/opencv_contrib 额外库包也下载下来。我曾经把opencv_contrib包的tracking模块 加入到opencv 核心库,编译到PC的CodeBlocks开发环境就成功了,但是编译成Android的环境就出错了,这个问题我一直没有解决,最后我换用了其它的方法,我把相应的一些资料提供给大家:
 
      我参考了上述的资料,在加载opencv 额外库的时候,编译了几次也没能成功,会报cmake 编译出错。我也让C++ 的同事尝试用cmake 帮我编译,也没能成功,也许我们对cmake 了解不够深,据说opencv extra 库是需要收费的,所以Android端不能直接编译进来,但是PC端是成功编译了的。如有编译成功的大神,请多多指教!

Android 接入 OpenCV库的三种方式的更多相关文章

  1. android中解析文件的三种方式

    android中解析文件的三种方式     好久没有动手写点东西了,最近在研究android的相关技术,现在就android中解析文件的三种方式做以下总结.其主要有:SAX(Simple API fo ...

  2. Android中关闭应用的三种方式

    当应用不再使用的时候,通常需要关闭应用,我们可以使用三种方式关闭android应用: 第一种方式:首先获取当前进程的id,然后杀死该进程(推荐) android.os.Process.killProc ...

  3. 界面跳转+Android Studio Button事件的三种方式

    今天学习界面跳转 java类总是不能新建成功 看了网上教程 (20条消息) 关于android studio无法创建类或者接口问题的解决方法_qq_39916160的博客-CSDN博客 可以新建了 但 ...

  4. Android实现全屏的三种方式

    一.通过代码 requestWindowFeature(Window.FEATURE_NO_TITLE);// 隐藏标题栏 getWindow().setFlags(WindowManager.Lay ...

  5. Android之——ContentResolver查询的三种方式

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/47785491 今天做到一个小项目.查询手机中短信的信息,当然得去系统暴露出来的数据 ...

  6. Android自动轮播的三种方式

    方法一:在runable里判断,不是最后条目的时候++,是的话=0,获取当前条目,给viewpager设置,然后在runable里递归post,在外面也post这个run // 自动轮播条显示 if ...

  7. 【Android学习】数据传递三种方式

    1.Application 注意在清单文件中的Application节点下注册android:name属性, 继承Application类,重写onCreate方法, 使用数据时,实例化自定义类时需要 ...

  8. OpenCV4Android释疑: 透析Android以JNI调OpenCV的三种方式(让OpenCVManager永不困扰)

    OpenCV4Android释疑: 透析Android以JNI调OpenCV的三种方式(让OpenCVManager永不困扰) 前文曾详细探讨了关于OpenCV的使用,原本以为天下已太平.但不断有人反 ...

  9. Android 使用OpenCV的三种方式(Android Studio)

    http://blog.csdn.net/sbsujjbcy/article/details/49520791 其实最早接触OpenCV是很久很久之前的事了,大概在2013年的5,6月份,当时还是个菜 ...

随机推荐

  1. c++编程思想(四)--对象和隐藏(感觉书上有误)

    c++编程思想里数据抽象和隐藏实现实际就是通常所说的类和封装: 封装,继承,多态对象特点说的很多,就不再说了 关于封装,本人觉得书上有个地方写的有问题,p145和p153都提到Y::f(X*)引用了X ...

  2. Java集合框架之三:HashMap源码解析

    版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! HashMap在我们的工作中应用的非常广泛,在工作面试中也经常会被问到,对于这样一个重要的集合模型我们有必要弄清楚它的使用方法和它底层的实 ...

  3. [译]AngularJS 1.3.0 开发者指南(一) -- 介绍

    [译]AngularJS 1.3.0 开发者指南(一) -- 介绍 Angular是什么 ? AngularJS是一款针对动态web应用的结构框架. 它可以让像使用模板语言使用HTML, 并且可以扩展 ...

  4. Visual Studio 2013 百度云下载地址

    Visual Studio 2013 百度云下载地址 链接:http://pan.baidu.com/s/1sjFifox 密码: ipqe VS2013注册码:BWG7X-J98B3-W34RT-3 ...

  5. .Net小白的第一篇博客

    2016年8月8日,经过了一周的纠结.我决定放弃了,原来学了六年并且工作两年的学前教育,走上了开发的道路.我认为生活就应该这样,就应该充满挑战,而不是每天在重复相同的工作!作为插班生的我,于2016年 ...

  6. 阿里云开发之OSS数据迁移

    最近由于项目需求,需要将一个aliyun账号下的oss数据导入到两一个aliyun账号下的oss,经过一番坎坷,最终搞定. 1.查看oss数据迁移官方文档,我是在本地windows电脑上进行操作的,先 ...

  7. tp框架基础(详细步骤分解,易懂)下

    在浏览器中如果要访问操作方法的时候以什么方式来访问 有四种方式 第一种是get方式,第二种是访问路径 这四种方式我们可以通过修改配置文件来改掉url的模式 我们需要来改一下我们的配置文件 在这个路径下 ...

  8. Json数据解析在Unity3d中的应用

    最近做项目过程中因为Json文件名写错了一个字母Unity报错,找错误找到半夜,当时为了验错,写了一个小Demo,正好借此总结一下Json. 1.什么是Json JSON(JavaScript Obj ...

  9. 【解题报告】VijosP1351 棋盘制作

    思路: 1. 矩形:用f[i][j][1]表示右下角为(I,j),最大的,符合条件的矩形的长,用f[i][j][2]表示右下角为(I,j),最大的,符合条件的矩形的高,预设f内所有元素为1 If(a[ ...

  10. 每天一个Linux命令 5

    命令名称:touch 功能描叙:创建空文件 格式:touch  文件名 范例:$touch japan.list(当前路径创建) $touch  /root/japan.list(指定路径创建) $t ...