赋料扬雄敌,诗看子建亲。这篇文章主要讲述Android Studio 中集成Opencv环境(包含opencv_contrib部分)相关的知识,希望能为你提供帮助。
我在上一篇博客中说到了在android中集成OpenCV,但是那个版本的OpenCV是没有SIFT和SURF算法的,因为这些算法是受专利保护的,所以并没有被包含在预编译库中,所以如果想要使用SIFT和SURF算法,需要自己来编译OpenCV Android SDK。在OpenCV 2.4.x版本中,这些算法被包含在nonfree模块中;从3.0版本开始,用于图像特征匹配的一些算法(比如SIFT,SURF,BRIEF,FREAK等)被转移到了opencv_contrib项目的xfeatures2d模块中。
我们需要从github上down下opencv_contrib部分内容,将其编译进去,github地址:https://github.com/opencv/opencv_contrib,注意需要与你下载的OpenCV for Android库相匹配。关于opencv_contrib库的编译,我在Windows和Linux(Ubuntu)中编译成功(这部分我会在后面的博客中提及),但是在Android平台的编译遇到我了极大的困难。我百度了很久,找到了一篇相对靠谱的博文:http://johnhany.net/2016/07/build-opencv-manager-for-android-on-ubuntu/,我按照作者所说一步步进行编译,最终都没有成功。不过万幸的是,作者在文章的后面给出了它编译成功的OpenCV Android SDK,是OpenCV3.2版本的,这里我也给出链接:https://pan.baidu.com/s/1kVOejLt,再次感谢作者。不过可惜的是,作者当初编译的时候仅仅解锁了SIFT、SURF和FREAK,并没有解锁BRIEF,可能不能满足所有人的要求,这里我也希望如果有大神编译成功了,将成功后的库发我一份。
到这里,我们已经拥有了编译有opencv_contrib部分的Android OpenCV SDK,目录结构如下:
文章图片
因为我们需要用到cmake,ndk等工具,所以需要预先打开SDK Manager进行管理(建议安装SDK Manager当中提供的NDK,便于管理),
文章图片
文章图片
然后我们在Android Studio中新建一个项目,新建的时候注意勾选Include C++ Support,之后一直下一步即可。
文章图片
进入项目后,我们发现项目的目录结构发生了一定变化,main目录下多出了一个cpp目录,而且多出了一个CmakeList文件(Android Studio2之后,我们可以通过cmake管理ndk调用C++,而不用在通过Android.mk文件,这无疑是一个福音)。
文章图片
然后我们参照我上一篇博客的操作,点击File-> New-> Import Module添加库,点击File-> Project Structure添加依赖,将OpenCVLibrary的build.gradle文件中的一下参数修改为与app的build.gradle文件中相同。
我们要将编译得到的库中sdk-> native-> libs中的文件全部拷贝到项目的main目录下,重命名为:jniLibs
将编译得到的库中sources-> opencv_contrib-> modules-> xfeatures2d-> src目录下的freak.cpp,precomp.hpp,sift.cpp,surf.cpp,surf.hpp,xfeatures2d_init.cpp共6个文件拷贝到app-> src-> main-> cpp文件夹中。其中,precomp.hpp文件需要做如下修改:
注释掉第52-53行:
1 #include "opencv2/core/private.hpp" 2 #include "opencv2/core/private.cuda.hpp"
注释掉第62行的
#include "opencv2/core/private.hpp"
然后,我们需要修改CmakeList.txt文件为:
1 cmake_minimum_required(VERSION 3.4.1) 2 3 set(CMAKE_VERBOSE_MAKEFILE on) 4 set(ocvlibs "${CMAKE_SOURCE_DIR}/src/main/jniLibs") 5 include_directories(${CMAKE_SOURCE_DIR}/src/main/cpp/include) 6 7 add_library(libopencv_java3 SHARED IMPORTED ) 8 set_target_properties(libopencv_java3 PROPERTIES 9IMPORTED_LOCATION "${ocvlibs}/${ANDROID_ABI}/libopencv_java3.so") 10 11 add_library( # Sets the name of the library. 12xfeatures2d 13 14# Sets the library as a shared library. 15SHARED 16 17# Provides a relative path to your source file(s). 18src/main/cpp/xfeatures2d_init.cpp 19src/main/cpp/sift.cpp 20src/main/cpp/surf.cpp 21src/main/cpp/freak.cpp) 22 23 find_library( # Sets the name of the path variable. 24log-lib 25 26# Specifies the name of the NDK library that 27# you want CMake to locate. 28log ) 29 30 target_link_libraries( # Specifies the target library. 31xfeatures2d android log libopencv_java3 32 33# Links the target library to the log library 34# included in the NDK. 35${log-lib} )
最后,我们需要修改app/build.gradle文件为:
1 apply plugin: \'com.android.application\' 2 3 android { 4compileSdkVersion 25 5buildToolsVersion "27.0.1" 6defaultConfig { 7applicationId "com.example.demo02" 8minSdkVersion 15 9targetSdkVersion 25 10versionCode 1 11versionName "1.0" 12testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 13externalNativeBuild { 14cmake { 15cppFlags "-std=c++11", "-frtti", "-fexceptions" 16abiFilters \'x86\', \'x86_64\', \'armeabi\', \'armeabi-v7a\', \'arm64-v8a\', \'mips\', \'mips64\' 17} 18} 19} 20sourceSets { 21main { 22jniLibs.srcDirs = [\'src/main/jniLibs\'] 23} 24} 25buildTypes { 26release { 27minifyEnabled false 28proguardFiles getDefaultProguardFile(\'proguard-android.txt\'), \'proguard-rules.pro\' 29} 30} 31externalNativeBuild { 32cmake { 33path "CMakeLists.txt" 34} 35} 36 } 37 38 dependencies { 39compile \'com.android.support:design:25.3.1\' 40compile fileTree(include: [\'*.jar\'], dir: \'libs\') 41androidTestCompile(\'com.android.support.test.espresso:espresso-core:2.2.2\', { 42exclude group: \'com.android.support\', module: \'support-annotations\' 43}) 44compile \'com.android.support:appcompat-v7:25.3.1\' 45testCompile \'junit:junit:4.12\' 46compile project(\':openCVLibrary320\') 47 }
至此,我们就可以在Android中使用SIFT和SURF算法啦,代码的话,转道www.baidu.com啦~~~
【Android Studio 中集成Opencv环境(包含opencv_contrib部分)】
推荐阅读
- dapper
- webApp实践后记
- Android驱动开发之earlysuspend睡眠模式--实现代码
- Android实现RecyclerView的下拉刷新和上拉加载更多
- Android之ViewFlipper的简单使用
- java 后台框架 支持APP接口调用 APP后台 手机后台框架java springmvc myb
- MyBatis DAO层传递参数到mapping.xml
- Java版本APP接口安全设计
- Android TabHost 实现Tab切换