• OpenCV


      我在上一篇博客中说到了在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
     9                       IMPORTED_LOCATION "${ocvlibs}/${ANDROID_ABI}/libopencv_java3.so")
    10 
    11 add_library( # Sets the name of the library.
    12              xfeatures2d
    13  
    14              # Sets the library as a shared library.
    15              SHARED
    16  
    17              # Provides a relative path to your source file(s).
    18              src/main/cpp/xfeatures2d_init.cpp
    19              src/main/cpp/sift.cpp
    20              src/main/cpp/surf.cpp
    21              src/main/cpp/freak.cpp)
    22 
    23 find_library( # Sets the name of the path variable.
    24               log-lib
    25 
    26               # Specifies the name of the NDK library that
    27               # you want CMake to locate.
    28               log )
    29 
    30 target_link_libraries( # Specifies the target library.
    31                        xfeatures2d 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 {
     4     compileSdkVersion 25
     5     buildToolsVersion "27.0.1"
     6     defaultConfig {
     7         applicationId "com.example.demo02"
     8         minSdkVersion 15
     9         targetSdkVersion 25
    10         versionCode 1
    11         versionName "1.0"
    12         testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    13         externalNativeBuild {
    14             cmake {
    15                 cppFlags "-std=c++11", "-frtti", "-fexceptions"
    16                 abiFilters 'x86', 'x86_64', 'armeabi', 'armeabi-v7a', 'arm64-v8a', 'mips', 'mips64'
    17             }
    18         }
    19     }
    20     sourceSets {
    21         main {
    22             jniLibs.srcDirs = ['src/main/jniLibs']
    23         }
    24     }
    25     buildTypes {
    26         release {
    27             minifyEnabled false
    28             proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    29         }
    30     }
    31     externalNativeBuild {
    32         cmake {
    33             path "CMakeLists.txt"
    34         }
    35     }
    36 }
    37 
    38 dependencies {
    39     compile 'com.android.support:design:25.3.1'
    40     compile fileTree(include: ['*.jar'], dir: 'libs')
    41     androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
    42         exclude group: 'com.android.support', module: 'support-annotations'
    43     })
    44     compile 'com.android.support:appcompat-v7:25.3.1'
    45     testCompile 'junit:junit:4.12'
    46     compile project(':openCVLibrary320')
    47 }

      至此,我们就可以在Android中使用SIFT和SURF算法啦,代码的话,转道www.baidu.com啦~~~

      

  • 相关阅读:
    跨页传值另一种方法
    运行nodejs的blog程序遇见问题
    nodejs和mongodb实践
    mongodb数据库实践笔记
    两次分页显示内容——先少后多显示
    Java进阶4表达式中的陷阱
    Java进阶3. 内存回收机制
    Java进阶1. Synchronized 关键字
    Java复习9网路编程
    Java复习8.多线程
  • 原文地址:https://www.cnblogs.com/fx-blog/p/8206737.html
Copyright © 2020-2023  润新知