Android使用OpenCV实现「人脸检测」和「人脸识别」
Android使用OpenCV实现「人脸检测」和「人脸识别」
DEMO
—————————-分割线———————————
效果图
先上效果图,不好弄gif
在网上找了在Android平台上使用OpenCV相关的教程,很少,大部分也都主要是介绍下人脸检测,很少有讲人脸识别,还有的人连人脸检测和人脸识别的概念都没有搞清,人脸检测只是识别到有人脸,能获取到一个人脸的大概位置,有几个人脸,而人脸识别是要获取到人脸特征做对比,识别这个人脸。有好多文章都写自己在讲人脸识别,实际上他只是做了人脸检测。
官方给的Demo是在Eclipse工程下的,如果你现在已经是在Android Studio下开发,因为Eclipse工程有makefile文件,迁移到Android Studio好像还是有点麻烦,我是干脆就在Eclipse下跑的Demo。
先甩过来官方给的一些文档:
Android Development with OpenCV
实现方式
按照官方的文档,我们在Eclipse里导入Demo进去以后,是不能直接运行的,需要安装Manager的一个APK,然后在Demo工程里通过AIDL的方式,调用OpenCV的核心方法,不过Demo给实现的功能也只是一个人脸检测。
SDK
下面来看一下SDK
目录:
- apk:Manager的apk
- doc:一些文档
- samples:示例工程和一些编译好的apk
- sdk:一些库文件
当然, 如果你的C/C++足够好,你肯定可以自己编译一个库,直接导入到工程,就不用安装Manager了,可惜了我自己还不行,哈哈……无奈安装Manager把……
如何将Demo导入到Eclipse并运行,上面官方的文档已经说的比较清楚了,至于会有什么问题就自行Google吧。
人脸检测
其实人脸检测并不是重点,Demo里已经实现了人脸检测的功能。
主要的实现方式:OpenCV有一个自己的org.opencv.android.JavaCameraView
自定义控件,它循环的从摄像头抓取数据,在回调方法中,我们能获取到Mat数据,然后通过调用OpenCV的Native方法,检测当前是否有人脸,我们会获取到一个Rect
数组,里面会有人脸数据,最后将人脸画在屏幕上,到此为止,Demo的人脸检测功能,就结束了。
人脸识别
人脸识别我这里用到了JavaCV
人脸识别逻辑:人脸识别的主要方式就是获取到人脸的特征值,然后将两个特征值做比对,取到一个相似度去做人脸识别,OpenCV这里的特征值,其实就是一张图片。
我们的从回调的Mat数据检测到有人脸以后,提取特征值(也就是保存人脸的一张图片到某个路径),然后比较特征值
为了提高识别的准确度,需要在检测到人脸以后,把人脸的部分截取出来,然后置灰(置灰的目的是为了方式色泽和明暗度对识别有影响)。
保存人脸特征值
/** * 特征保存 * * @param image Mat * @param rect 人脸信息 * @param fileName 文件名字 * @return 保存是否成功 */ public boolean saveImage(Mat image, Rect rect, String fileName) { try { String PATH = Environment.getExternalStorageDirectory() + "/FaceDetect/" + fileName + ".jpg"; // 把检测到的人脸重新定义大小后保存成文件 Mat sub = image.submat(rect); Mat mat = new Mat(); Size size = new Size(100, 100); Imgproc.resize(sub, mat, size); Highgui.imwrite(PATH, mat); return true; } catch (Exception e) { e.printStackTrace(); return false; } }
提取特征值
之前已经说了嘛,人脸特征其实就是一张人脸图片,所以提取人脸特征其实就是获取一张人脸图片
/** * 提取特征 * * @param fileName 文件名 * @return 特征图片 */ public Bitmap getImage(String fileName) { try { return BitmapFactory.decodeFile(Environment.getExternalStorageDirectory() + "/FaceDetect/" + fileName + ".jpg"); } catch (Exception e) { e.printStackTrace(); return null; } }
人脸识别
这里主要使用了JavaCV的方法
/** * 特征对比 * * @param file1 人脸特征 * @param file2 人脸特征 * @return 相似度 */ public double CmpPic(String file1, String file2) { int l_bins = 20; int hist_size[] = {l_bins}; float v_ranges[] = {0, 100}; float ranges[][] = {v_ranges}; opencv_core.IplImage Image1 = cvLoadImage(Environment.getExternalStorageDirectory() + "/FaceDetect/" + file1 + ".jpg", CV_LOAD_IMAGE_GRAYSCALE); opencv_core.IplImage Image2 = cvLoadImage(Environment.getExternalStorageDirectory() + "/FaceDetect/" + file2 + ".jpg", CV_LOAD_IMAGE_GRAYSCALE); opencv_core.IplImage imageArr1[] = {Image1}; opencv_core.IplImage imageArr2[] = {Image2}; opencv_imgproc.CvHistogram Histogram1 = opencv_imgproc.CvHistogram.create(1, hist_size, CV_HIST_ARRAY, ranges, 1); opencv_imgproc.CvHistogram Histogram2 = opencv_imgproc.CvHistogram.create(1, hist_size, CV_HIST_ARRAY, ranges, 1); cvCalcHist(imageArr1, Histogram1, 0, null); cvCalcHist(imageArr2, Histogram2, 0, null); cvNormalizeHist(Histogram1, 100.0); cvNormalizeHist(Histogram2, 100.0); return cvCompareHist(Histogram1, Histogram2, CV_COMP_CORREL); }
最后
看我轻描淡写了一篇博客写完了,看上去好像挺容易的,但是对于第一次做人脸识别的人或者对JNI还不是很熟的人来说,可能并没有想象的那么简单,你会遇到各种库找不到,编译不通过等等的问题,总之吧,一个大概的实现思路呈现出来,仅供参考,就是这样!
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
OpenCV+python 人脸识别
首先给大家推荐一本书:机器学习算法原理与编程实践 本文内容全部转载于书中,相当于一个读书笔记了吧 绪论 1992年麻省理工学院通过实验对比了基于结构特征的方法与基于模版匹配的方法,发现模版匹配的方法要优于基于特征的方法。 以支持向量机为代表的统计学习理论在随后被应用到了人脸识别与确认中去。但是由于算法运行效率问题,很快被一种新的算法替代了。这就是2001年康柏研究院提出的基于简单矩形特征和AdaBoost的实时人脸检测系统。该方法的主要贡献包括: 1.可以快速计算简单矩形特征作为人脸图像特征 2.基于AdaBoost将大量弱分类器进行组合形成强分类器的学习方法。 3.采用了级联(Cascade)技术提高检测速度。目前,基于这种人脸/非人脸学习的策略已经能够实现准实时的多姿态人脸检测与跟踪,这为后端的人脸识别提供了良好的基础。 人脸检测 人脸检测主要用于人脸识别的预处理,即在图像中标注出人脸所处的位置和大小。为了能够确定图片中包含一张或几张人脸,首先要确定人脸的通用结构。我们都有:眼镜、鼻子,前额,颧骨和嘴,所有这些构成了一张通用的人脸结构。下图的特征组件分别标识了上述结构。 组合这些特...
- 下一篇
【NLP】揭秘马尔可夫模型神秘面纱系列文章(一)
初识马尔可夫和马尔可夫链 作者:白宁超 2016年7月10日20:34:20 摘要:最早接触马尔可夫模型的定义源于吴军先生《数学之美》一书,起初觉得深奥难懂且无什么用场。直到学习自然语言处理时,才真正使用到隐马尔可夫模型,并体会到此模型的妙用之处。马尔可夫模型在处理序列分类时具体强大的功能,诸如解决:词类标注、语音识别、句子切分、字素音位转换、局部句法剖析、语块分析、命名实体识别、信息抽取等。另外广泛应用于自然科学、工程技术、生物科技、公用事业、信道编码等多个领域。本文写作思路如下:第一篇对马尔可夫个人简介和马尔科夫链的介绍;第二篇介绍马尔可夫链(显马尔可夫模型)和隐马尔可夫模型以及隐马尔可夫模型的三大问题(似然度、编码、参数学习);第三至五篇逐一介绍三大问题相关算法:(向前算法、维特比算法、向前向后算法);最后非常得益于冯志伟先生自然语言处理教程一书,冯老研究自然语言几十余载,在此领域别有建树。(本文原创,转载注明出处:初识马尔可夫和马尔可夫链 ) 目录 【自然语言处理:马尔可夫模型(一)】:初识马尔可夫和马尔可夫链 【自然语言处理:马尔可夫模型(二)】:马尔可夫模型与隐马尔可夫模型...
相关文章
文章评论
共有0条评论来说两句吧...