首页 > 技术文章 > Android之OpenCv

xuepeng0521 2014-12-04 10:41 原文

  这几天要在Android平台上实现OpenCv相关的功能,看了几个博客、论文,终于实现了Android上OpenCv开发的一个简单例子。期间遇到了不少大大小小的问题,现总结一下。当然还有很多问题我自己也不是很明白,希望大家不吝赐教。

、准备工作

  1.Windows平台下搭建好Android开发环境

   这里特别提一下Android SDK环境变量的配置(之前做android开发并没有配置SDK环境变量衰,感觉自己好弱啊)

   1.1 和配置Jdk环境变量类似,打开 计算机->属性->高级系统设置->高级->环境变量,在系统环境变量栏目下新建变量"ANDROID_SDK_HOME",并设置变量值为adt-bundle-windows目录下sdk目录的路径,我的是E:\adt-bundle-windows-x86_64_20140101\sdk

   1.2 在path中添加"%ANDROID_SDK_HOME%\tools;%ANDROID_SDK_HOME%\platform-tools".注意分号分隔

   1.3 检查SDK是否配置成功,cmd命令行输入android –h,出现如下结果,表明配置成功

    

  2.Android NDk的安装与配置

  下载地址:https://developer.android.com/tools/sdk/ndk/index.html

  使用最新ndk,直接抛弃cygwin(貌似版本在r7以上),以前做Android的项目要用到NDK就必须要下载NDK,下载安装Cygwin(模拟Linux环境用的),下载CDT(Eclipse C/C++开发插件),还要配置编译器,环境变量,特别麻烦,新版就不需要了。

  如下图是我下载的NDK版本参数

  

  双击该.exe 文件,运行会提示选择解压目录,可以任意解压到某一目录,我选择解压到了E盘根目录下。

    在eclipse中,选择windows->Preference->Android->NDK,然后添加刚才解压的NDK目录的路径,如下图所示

  

  3. 配置OpenCv for android环境

  下载地址:http://sourceforge.net/projects/opencvlibrary/files/opencv-android/(我下载的是OpenCV-2.4.9-android-sdk.rar)

  解压该文件。将解压后的目录下的sdk改名为:OpenCVSdk(可以随意,也可以不改,方便就好)。

  打开eclipse,选择FIle->import,选择Existing project into workspace……导入该sdk工程。该工程师在我们做OpenCv开发时要引用的第三方类库,所以我们要设置其属性:

  

  这种情况下,我们就可以直接调用android为我们封装好的openCv接口进行开发。

二、NDK开发的实例,参照网上资料学习的第一个入门工程。

  新建android工程,命名为TestOpenCv。

  1.新建用于创建本地函数调用的类ImageProc.java 

1 package my.example.ndkopencv;
2 
3 public class ImageProc {
4     public static native int[] grayProc(int[] pixels, int w, int h);
5 }

  2.生成c++头文件

  打开cmd,进入工程所在的目录下的bin/classes目录下,执行com.example.testopencv.ImageProc命令:

  

  此时,在D:\WorkSpace\TestOpenCv\bin\classes目录下生成com_example_testopencv_ImageProc.h文件,将该文件重命名为ImageProc.h。

  3.生成本地jni引用

  项目右键,选择Android Tools->Add Native Support

  

  此时会生成一个JNI文件目录,如下图

  

  将之前生成的ImageProc.h复制到该目录下,

  下面分别介绍jni目录下的文件

  3.1.Application.mk

APP_STL:=gnustl_static
APP_CPPFLAGS:=-frtti -fexceptions 
APP_ABI:= armeabi-v7a 

  3.2.Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

OpenCV_INSTALL_MODULES:=on
OPENCV_CAMERA_MODULES:=off


OPENCV_LIB_TYPE:=STATIC


ifeq ("$(wildcard $(OPENCV_MK_PATH))","")
include ../OpenCvSdk/native/jni/OpenCV.mk
else  
include $(OPENCV_MK_PATH)  
endif 

LOCAL_SRC_FILES  := ImageProc.cpp
LOCAL_MODULE     := image_proc

LOCAL_LDLIBS    += -lm -llog 
			
include $(BUILD_SHARED_LIBRARY) 

  第一行:指明当前编译路径;

  第二行:清空变量;

  第三行:自动将依赖的OpenCV的so库拷贝到libs目录下

  include ../OpenCvSdk/native/jni/OpenCV.mk :将OpenCV类库中的编译文件包含进来,如此一来在我们的工程中即可使用OpenCV类库;

  LOCAL_SRC_FILES := ImageProc.cpp :指定需要编译的C++源文件;

  LOCAL_MODULE := image_proc :指定编译生成的类库名称;

  include $(BUILD_SHARED_LIBRARY) :调用命令将源文件编译为静态库。

  3.3.ImageProc.cpp

  这里是c++源文件,根据我们不同的需求编写相应的代码。注意这里有入口函数,需要直接从之前生成的.h文件中复制:

  

  如上图,我定义了2个本地函数,就可以直接复制该函数到.cpp文件中作为入口函数。

4. 导入相应的包

  选中工程,右键选择properties,在左侧选择C/C++ General->Paths and Symbols.

  

  这里我是很盲目的一个一个导入的,很想知道有没有比较快捷的方法快速导入。求不吝赐教。

  至此,开发环境基本完成。

推荐阅读