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

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

英文原版购书链接:亚马逊《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-Chp7-r3

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

        本章介绍如何在Android Studio 2上通过OpenCV使用两种基本的机器学习算法:支持向量机(SVM)和最近邻分类器(KNN),并开发一个简单的数字识别应用。关于这两种算法的原理可以参考《深入OpenCV Android应用开发》第七章。

        本文需要用到MNIST数据集。如果官方网页打不开,可以在这里下载。下载好后,把train-images.idx3-ubyte和train-labels.idx1-ubyte两个文件拷贝到手机(或者模拟器)的SD卡根目录(没有单独SD卡的则拷贝到手机内存的根目录)。


开发环境

        Windows 10 x64

        Android Studio 2.3.3(Gradle 3.3,Android Plugin 2.3.3)

        Android 7.0(API 24)

        JDK 8u141

        OpenCV 3.2.0 Android SDK


代码及简略解释

        1. 创建Android Studio项目,包命名为net.johnhany.moaap_chp7。导入OpenCV-android-sdk\sdk\java到项目中,并为app模块加载模块依赖。

        2. 将app\src\main\java\net\johnhany\moaap_chp7\MainActivity.java文件修改为如下内容:

        3. 修改app\src\main\res\layout\activity_main.xml文件:

        4. 在app\src\main\java\net\johnhany\moaap_chp7下新建一个DigitRecognizer.java文件(非Activity类),其内容为:

        在这个DigitRecognizer包含了大部分核心代码。如果想使用SVM,注释掉134-135行,并取消132-133行的注释,这样运行时就要先读入训练数据并训练SVM,然后从摄像头读入图像,并对图像中央区域的数字进行分类。由于SVM训练过程计算量比较大,特别是移动平台上缺少多线程等优化时性能更是直线下降。推荐不更改代码,直接读取我训练好的SVM分类器。预训练的分类器文件在这里下载:http://pan.baidu.com/s/1nuS3M9F,下载好后拷贝到手机SD卡根目录。如果想要自己训练SVM,推荐在电脑上进行训练,然后把训练好的分类器文件提供给Android应用使用。训练SVM的C++代码在这里。在Windows平台式配置OpenCV开发环境的方法可以参考《Windows7+VS2012下64位OpenCV3.0+CUDA7.5的编译和部署》。我实验的结果是,迭代训练500次,精度74%,远不能达到实际运用的要求,至少比胡乱猜准一些-_-

        如果想要使用KNN,注释掉134-135行、169行,取消掉127-129行、166行的注释。与SVM正相反,KNN的“训练”过程非常快,分类过程反而计算量非常大,因为OpenCV的实现只是把所有样本保留下来,然后通过所有已知样本与新样本计算相似度,在实机上测试时能明显感到卡顿。不过让人惊喜的是,KNN的测试精度能够达到96.65%(C++版本代码在这里),比某些缺乏优化的CNN模型效果还要好。

        5. 修改app\src\main\res\AndroidManifest.xml文件为如下内容:

        6. 修改app\src\main\res\values\strings.xml文件:

        7. 修改app\src\main\res\values\styles.xml文件:

        8. app\build.gradle文件修改为:

        9. openCVLibrary320\build.gradle文件修改为:

        10. 检查一下项目根目录的build.gradle文件是否为如下内容:


运行效果

        SVM运行效果:

        KNN运行效果:


参考

http://answers.opencv.org/question/93682/svm-model-fails-to-load/?answer=93683#post-id-93683

2 评论 在 "深入OpenCV Android应用开发 中文版 – 第七章代码更新"

订阅评论
排序:   最新 | 最旧
wpDiscuz