深入OpenCV Android应用开发 中文版 – 第三章代码更新

book

本书中文版链接:京东  当当

英文原版链接:亚马逊《Mastering OpenCV Android Application Programming》


        原书所给代码以章为单位,针对的Android版本从API 19到API 21不等,同时使用的OpenCV库版本也有2.4.9和2.4.10两种。本文给出的代码是在原书代码的基础上,针对Android 7.0(API 24)与OpenCV 3.2进行了修改,适当地增加了一些预处理等操作,以使代码整体上更合理。

        原书的完整代码可以在这里获取:https://www.packtpub.com/lcode_download/22299

        更新后的代码托管在GitHub:https://github.com/johnhany/MOAAP/tree/master/MOAAP-Chp3-r3

        关于在Android Studio上配置OpenCV 3.1开发环境的方法,请参考《在Android Studio上进行OpenCV 3.1开发》

        关于在Android Studio上利用CMAKE配置OpenCV NDK开发环境的方法,请参考《Android Studio 2.3利用CMAKE进行OpenCV 3.2的NDK开发》

        本章介绍如何在Android Studio 2上利用OpenCV 3.2的Java API和Native API,通过Android NDK r15b开发一个图像匹配应用,涉及的算法有SIFT,SURF,ORB,BRISK和FREAK。关于以上各算法的原理可以参考《深入OpenCV Android应用开发》第三章。

        本书中文版在62页介绍了向Android项目添加nonfree模块的方法,但对于OpenCV 3.2是不适用的。首先,在OpenCV 3.2中,SIFT等匹配算法被转移到了opencv_contrib项目的xfeatures2d模块中。其次,即使在项目的Android.mk中添加所需的源码文件,由于OpenCV 3.2本身的一个BUG而且,由于匹配算法大多受专利保护,OpenCV源码的features2d_manual.hpp文件中默认没有声明相应的C++接口。所以就需要自己来编译支持SIFT等匹配算法的OpenCV Android SDK,并生成相应的OpenCV Manager安装包。所以,本文所给的代码与原书相比变化较大。

        此外,由于涉及的目标匹配算法计算量都比较大,所以本章引入了Android多线程编程技巧,利用AsyncTask执行核心计算,以避免阻塞主UI进程。具体细节请参考下文代码。


开发环境:

        Ubuntu 16.04 x64(用于OpenCV Android SDK的编译,也可直接下载我编译好的SDK

        Windows 10 x64专业版(用于项目开发)

        Android Studio 2.3.3(Gradle 3.3,Android Plugin 2.3.3)

        Android 7.0(API 24)

        Android NDK r15b

        JDK 8u141

        OpenCV 3.2.0 Android SDK(需要自己编译)


编译OpenCV Android SDK:

        请参考《Ubuntu 16.04下为Android编译OpenCV 3.2.0 Manager》的过程为该项目编译一个支持SIFT,SURF和FREAK算法的OpenCV Android SDK,并将编译产生的OpenCV-android-sdk文件夹拷贝到某个位置,比如/home/john/Android/OpenCV-contrib-android-sdk(我把自己编译的OpenCV Android SDK重命名为OpenCV-contrib-android-sdk以区分官方的预编译库)。

        我的Android SDK目录为/home/john/Android/Sdk,Android NDK目录为/home/john/Android/Sdk/ndk-bundle。

opencv-contrib-android-sdk

        向Android项目导入自己编译的OpenCV Android SDK,显示的名称为openCVLibrary310dev,而且在项目结构视图里会出现两个模块,分别为openCVLibrary310openCVLibrary310dev,其中openCVLibrary310dev需要加入app的Dependencies。如果是以3.2.0 Release源码编译的,则导入后的模块名称仍为openCVLibrary320

project-structure


代码及简略解释:

        1.创建Android Studio项目,包命名为net.johnhany.moaap_chp3

        2.在app\src\main\java目录中找到net.johnhany.moaap_chp3包,为MainActivity.java添加如下代码:

        与原书的代码相比,变化主要有:

        (1)去掉了一些无用的import,增加了一些必要的import;

        (2)在onCreate()中增加了动态申请外部存储读取权限的机制,并增加了相应变量REQUEST_READ_EXTERNAL_STORAGEread_external_storage_granted;在需要保存输出图像的代码之前增加了申请外部存储写入权限的代码,并增加了相应变量REQUEST_WRITE_EXTERNAL_STORAGEwrite_external_storage_granted

        (3)将部分Log.d()替换为Log.i(),便于查看调试信息;

        (4)更新了OpenCV的版本,OPENCV_VERSION_2_4_9改为OPENCV_VERSION_3_2_0

        (5)把jni模块nonfree重命名为xfeatures2d

        (6)考虑到FREAK方法默认对单通道图像进行匹配,所以加入将彩色图像转换为灰度图像的代码,强制对所有方法以单通道显示结果。

        3.在app\src\main\java目录中添加一个名为HomeActivity.java的文件,其内容如下:

        4.在修改app/CMakeLists.txt内容如下:

        关于该文件中各项的含义,请参考《Android Studio 2.3利用CMAKE进行OpenCV 3.2的NDK开发》

        5.把/home/john/Downloads/opencv-master/opencv_contrib/modules/xfeatures2d/src目录下的freak.cppprecomp.hppsift.cppsurf.cppsurf.hppxfeatures2d_init.cpp共6个文件拷贝到app\src\main\cpp文件夹中。其中,precomp.hpp文件需要做如下修改:

        注释掉第52-53行的

        再注释掉第62行的

        6.修改app/src/main/res/layout/activity_main.xml文件内容为:

        7.在app/src/main/res/layout目录中添加activity_home.xml文件,其内容如下:

        8.在app/src/main/res目录下新建一个名为menu的文件夹,在其中添加一个menu_main.xml文件,内容如下:

        9.修改app/src/main/res/values/strings.xml文件,内容为:

        10.修改app/src/main/AndroidManifest.xml文件为如下内容:

        11.修改app/build.gradle文件为:

        12.修改openCVLibrary320项目下的build.gradle文件为:

        13.确认一下项目根目录下的build.gradle文件是否为:


运行效果:

Screenshot_20160729

40

avatar
14 Comment threads
26 Thread replies
0 Followers
 
Most reacted comment
Hottest comment thread
16 Comment authors
徐小小刘涛shadow_wxhwillson黄欣欣 Recent comment authors
  Subscribe  
最新 最旧
订阅评论
徐小小
徐小小

博主,android studio 2.3版本的代码还有吗,我看资料下载地址的是3点多的版本了

徐小小
徐小小

按这个方法到最后会 Error:fatal error: ‘opencv2/core/cuda.hpp’ file not found

刘涛
刘涛

博主大神哥哥,书本附带的代码能发我邮箱一份吗?感谢ing!  18241266008@sina.cn

shadow_wxh
shadow_wxh

大神,第四章的还出不了?原书的代码实在是没法看,版本太落后了。

willson
willson

请问编译的代码能发给我吗  

Eirot

感谢分享,大赞!!

陳小莫
陳小莫

請問我得到這個錯誤是哪裡有錯嗎? 照著上面的步驟做

java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "_ZN2cv3hal6exp32fEPKfPfi" referenced by "libxfeatures2d.so"

陳小莫
陳小莫

對了~ 關於 把/home/john/Downloads/opencv-master/opencv_contrib/modules/xfeatures2d/src目录下的freak.cpp,precomp.hpp,sift.cpp,surf.cpp,surf.hpp,xfeatures2d_init.cpp共6个文件拷贝到app\src\main\jni文件夹中。其中,precomp.hpp文件需要做如下修改:

這六個文件 我是網路上google 載的 不知道有沒有差!!

陳小莫
陳小莫

還是可以請站長提供一下 您的這六個文件~~

或是編譯過後的.so檔呢

陳小莫
陳小莫

整個錯誤訊息是 E/art: dlopen("/data/app/com.example.yantingchen.testopencv3-2/lib/arm/libxfeatures2d.s… 阅读更多 »

陳小莫
陳小莫

使用手機實機系統是api 21的

不過我用虛擬機器23的 錯誤又不一樣

尼莫
尼莫

請問如何使用openCV 3.1 去支援 android api level 18的版本

因為專案的minSdkVersion 是18  

所以不知道有沒有方法是可以支援到18的

誓与
誓与

《深入OpenCV Android应用开发》这本书我买了,刚开始学习。请问其他章节的代码有更新计划吗?

Mr.WWW
Mr.WWW

麻烦给我发一份原书的完整代码,我到网站上下载不了。邮箱:3302436132@qq.com

飞龙
飞龙

你好,第6步的opencv_contrib,我下载了github上的6个文件,并注释了precomp.hpp的52-53,66行,OpenCV的sdk也是用你编译的,编译报错:Error:(46, 40) opencv2/xfeatures2d/cuda.hpp: No such file or directory

然后我把46和48行注释了,还是报错:

Error:(48, 4) error: #error this is a private header which should not be used from outside of the OpenCV library
Error:(52, 22) cvconfig.h: No such file or directory

请问这是什么原因呢,能提供一下你的freak.cpp,precomp.hpp,sift.cpp,surf.cpp,surf.hpp,xfeatures2d_init.cpp文件吗

飞龙
飞龙

好像是我理解错了,我以为http://pullrequest.opencv.org/buildbot/export/opencv_releases/precommit_pack_android/20160723-073613_116/

这个路径的包是你编译的。能分享一下你编译的OpenCV Android SDK吗?我没有Ubuntu环境,windows环境下不知道怎么编译

余传木
余传木

博主你好,你那有用Cmake编译的opencv2.4.10的库吗?有的话能不能分享一下,我的邮箱1219493801@qq.com

张某某
张某某

这些代码都是你因为要帮老师做项目写的还是自己纯兴趣写的啊? 真的很厉害!

trackback

[…]         另外附上一篇在Android上利用SIFT,SURF和FREAK进行目标匹配的教程:《深入OpenCV Android应用开发 中文版 – 第三章代码更新》。 […]