opencv与android的结合

mind_programmonkey 2018-06-19 08:54
关注文章

Android与OpenCV的结合

   第一步:新建一个Android Studio的工程,这里要注意app目录下的build.gradle文件,注意项目依赖;
   第二步:要下载Android OpenCV官方库,下载最新版本opencv-*-android-sdk.zip,解压之后我们需要将该目录导入到android的项目中。(文件可见)
        https://sourceforge.net/projects/opencvlibrary/files/opencv-android/
   第三步:在第一步建立好的android studio的项目基础之上,选择new->import module,然后选择好我们第二步解压好的OpenCVSDK目录下的sdk/java文件。注意:这里要修改openCVLibrary的build.grade文件,需要与第一步中app目录下的build.grade文件中的配置保持一致。
   第四步:Android OpenCV通过JNI(Java Native Interface )的方式调用OpenCV库,因此需要为应用指定JNI目录,这里我新建一个jniLibs的目录,导入OpenCVSDK/sdk/native/libs
   第五步:opencv需在应用配置中声明,选择左侧的app,选择Open Module Settings,然后选择Dependencies窗口,点击右上角的+号,选择Module dependcy,然后将OpencvLibrary引入到应用中即可。

Android与OpenCV的结合的具体实例---手写数字识别

description

Android与OpenCV的结合的具体实例---手写数字识别

设计思路:

   考虑到手机的处理器性能,所以这次的手写数字识别的实现不会在手机端进行SVM分类器的训练。换句话说,我们首先需要在PC端上用OpenCV训练出一个可用的SVM分类模型,然后在Android上将这个分类模型进行加载,最后在用它进行手写体的分类测试。

1.界面布局文件Layout:

   界面设计中,除了两个交互性的按钮Button和一些显示性的静态文本之外,需要我们特别注意的是通过触摸屏进行手写的部分。
   关于手写的这部分是继承于Android的View的,我们将其命名为HandWriteView。当手指在屏幕上滑动时,会触发onTouchEvent函数,在这个函数中进行坐标提取,并把每次滑动的轨迹用很小的线段拼接起来,这样就达到了手写体显示的效果。在机芯识别时,将当前View上面的内容通过BitMap取出,然后送入SVM分类器进行识别。

2.核心代码

2.1加载SVM分类器:

   SVM是一种有机监督的机器学习方式,简单来讲,SVM就是把一幅图进行各种运算,提取出一幅图像的特征,特征用向量表示,通过不断的学习,让这个向量越来越逼近图像的真实特征,具体的手段是把图像数据不断地进行抽象提取特征。  
   
  OpenCV中就提供了类SVM用于实现SVM支持向量机算法,既然我们调用这个算法,那么我们就需要给SVM喂食(即提供训练库),这里用的手写库是MNIST库,是美国人提供的一个免费的手定数字识别库。
   
   将我们已经训练好的SVM模型,放入Android的res目录下,这里新添加一个raw目录,然后存放文件raw/mnist.xml 
  
   首先先声明一个SVM分类器
   
    类器和SVM模型的承载器:
                                                                     CvSVM mClassifier;
                                                                      File mSvmModel;

   
    然后通过Android的资源目录将保存好的分类器模型进行载入,模型的名字为mnist.xml

description

在这一步中,mClassifier已经将整个SVM模型加载完成,可以进行接下来的预测。    

2.2HandWriteView代码的实现:

   用来绘制手写体,在这个View类的初始化里面,我们设置好画笔的颜色、宽度,同时需要注意的是要设置笔触风格和连接处的形状为“圆形”,以及设置反锯齿,这样会使得画出来的手写体数字更光滑,细节处更加连贯,有利用后期的判断。

2.3MainActivity识别数字代码的实现:

   在主activity中,当按下识别按钮时,会从HandWriteView中返回得到一个Bitmap,它是当前绘制得到的一个截图,然后将这个Bitmap转换为OpenCV的Mat格式。同时进行灰度化处理。

description

   由于我们的SVM分类器模型是基于MNIST数据集进行训练得到的,数据集中的每幅图片的大小是28*28.因此在进行实际测试时,我们也需要将 上一步手写得到的图片进行resize处理,归一化到[0,1],并且转换为一维向量。

description

   其中特别注意的是归一化,MNIST中每幅图片的数据都是在[0,1]之间,要保持一致才能得到正确的结果,最后,我们调用加载好的SVM模型进行预测,得到识别的数字:

3.AndroidManifest.xml文件中权限的申请(SD卡写入申请的权限)

description

文章被以下专辑收录
{{panelTitle}}
支持Markdown和数学公式,公式格式:\\(...\\)或\\[...\\]

还没有内容

关注微信公众号