最近因为需要实现了一下人脸识别,实现了这个功能之后,就想着把踩过的坑总结出来。参考过许多博客,发现主要有两种形式,一种是基于 android SDK 实现人脸检测,而另一种是利用openCvManager来实现。这两种方式都实现了动态的人脸检测,当然网上也有许多关于检测静态图片中的人脸的文章。这里我就不详细介绍了。我这里实现的功能主要是启动Camera之后,当照相机中有人脸出现时,Camera界面动态的绘制出人脸矩形框,获取到人脸框之后,Camera拍照,获取到图片,将图片传送到后台来验证人脸。这里需要区分一下人脸检测和人脸识别。人脸检测是检测camera中是否有人脸存在,如果存在的话会绘制出矩形框将人脸标志出来,而人脸识别则是根据两张人脸验证是否是一个人的概念。
        先大概讲一下第一种实现动态人脸检测的方式.这是Camera基于Google自带的FaceDetectionListener进行人脸检测,当Camera拍摄到人脸后,会将人脸矩形绘制出来。这个具体大家可以参考这位大神的博客,http://blog.csdn.net/yanzi1225627/article/details/38098729/
他已经讲的很细致了。但感觉google自带检测算法在测试的时候检测人脸比较慢,而且有些机型不支持这种人脸检测接口,不过他的文章还是很具有参考价值的。那么我就在这里就具体介绍一下使用openCv实现动态人脸检测的具体方法。
       先提供下opencv下载地址http://opencv.org/ 我下载的是最新的3.2版本,本来用的是2.4,但会发现比较卡顿。公司一直使用的eclipse,而且demo中的工程也是eclipse项目,所以直接使用eclipse来进行调试。当然网上也有许多在As中使用的教程,大家可以去多找找。
在我们下载sdk后解压后,进入到samples目录下会见到如下结构:

我们直接运行example-face-detection.apk后,会发现提示要安装opencv-manager,在sdk/apk目录下,我们会发现不同种类的opencvmanager,我们根据不同的机型选择对应的manager安装,我选择的是OpenCV_3.2.0_Manager_3.20_armeabi-v7a.apk这个包,安装之后,我们打开应用后就可以发现摄像头进行动态的人脸检测了。 运行完官方的apk后,我们开始自己进行调试。我们导入OpenCV-android-sdk/samples的face-detection工程,然后新建个工程作为Library,在我们的library中导入OpenCV-android-sdk/java中相关类和资源文件,

然后对face-detection进行关联,这时候我的工程仍然报错,发现下面的错误:

没有找到ndk-build.cmd.原来是没有配置ndk-build路径,配置完NDKROOT即可。这里就是右键properties-C/C++build,如下图:

这里的ndk我下载的是android-ndk-r9d,在下载完毕之后我们直接解压就行,这里的NDKROOT就是我们解压后的ndk的路径。附带上Ndk的下载路径: http://dl.google.com/android/ndk/android-ndk-r9d-windows-x86.zip        之后又碰见如下错误:

这是因为在jni/Android.mk中没配置opencv的Opencv.mk的根路径,同理和ndk配置方式一样,我们配置完我们自己的${OPENCV_ANDROID_SDK}就行了

至此,我们运行官方的demo,可直接就运行出来,但我们发现总需要安装opencvmanager,很明显,有时候这是不合适的。所以接下来我介绍下不需要安装opencvmanager的方法,很简单,分下面4步: 1.修改Android.mk前几行 为下列形式, ``` include $(CLEAR_VARS) OPENCV_CAMERA_MODULES:=on OPENCV_INSTALL_MODULES:=on OPENCV_LIB_TYPE:=SHARED ``` 2.打开FdActivity.java文件,在其中添加一个静态初始化块代码, ``` static { Log.i(TAG, "OpenCV library load!"); if (!OpenCVLoader.initDebug()) { Log.i(TAG, "OpenCV load not successfully"); } else { System.loadLibrary("detection_based_tracker");// load other libraries } } ``` 它是用来加载OpenCV_java库的,如果没有加回报类似于native method not found的错误 3.注释掉onResume中的initAsync那句,让程序不去访问OpenCV Manager。 ``` @Override public void onResume() { super.onResume(); if (!OpenCVLoader.initDebug()) { Log.d(TAG, "Internal OpenCV library not found. Using OpenCV Manager for initialization"); // OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_0_0, this, mLoaderCallback); } else { Log.d(TAG, "OpenCV library found inside package. Using it!"); mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS); } } ``` 4.修改FdActivity.java的OnCreate()方法,从上面的private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this)代码块中拷贝try-catch块放到OnCreate的setContentView()之后。

      try {// load cascade file from application resourcesInputStream is = getResources().openRawResource(R.raw.lbpcascade_frontalface);File cascadeDir = getDir("cascade", Context.MODE_PRIVATE);mCascadeFile = new File(cascadeDir, "lbpcascade_frontalface.xml");FileOutputStream os = new FileOutputStream(mCascadeFile);byte[] buffer = new byte[4096];int bytesRead;while ((bytesRead = is.read(buffer)) != -1) {os.write(buffer, 0, bytesRead);}is.close();os.close();mJavaDetector = new CascadeClassifier(mCascadeFile.getAbsolutePath());if (mJavaDetector.empty()) {Log.e(TAG, "Failed to load cascade classifier");mJavaDetector = null;} elseLog.i(TAG, "Loaded cascade classifier from " + mCascadeFile.getAbsolutePath());mNativeDetector = new DetectionBasedTracker(mCascadeFile.getAbsolutePath(), 0);cascadeDir.delete();} catch (IOException e) {e.printStackTrace();Log.e(TAG, "Failed to load cascade. Exception thrown: " + e);}

之后运行,即可发现不用在依赖OpenCvManager,程序也可以直接运行了。
这里上述进行的主要是camera动态监测出人脸,其实这基本上已经算完成了。现在我们集成到我们自己的工程中,通过利用百度的人脸识别,来判断人脸是否一致,从而实现人脸识别。
首先,我们可以在百度AI开放平台上 http://ai.baidu.com/ 创建我们自己的人脸识别应用
![这里写图片描述](https://img-blog.csdn.net/20170712160653919? /2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMjg5MzE2MjM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
创建完后 我们的应用会有一个APPiD和ApI key我们利用这两个属性值可生成access_token具体的调用方式我们可参考
https://cloud.baidu.com/doc/FACE/Face-API.html生成access_token后,当发送post请求时,附带上这个token即可,我们可以进行人脸识别了。我这里调用的是人脸注册和人脸认证接口,通过认证返回的分数值,我们可判断是否是同一个人。具体请求参数和返回参数,大家可以参考百度人脸识别的API。
好了,现在开始创建我们的应用。在创建完工程后,我们把face-detection中的FdActivity和DetectionBasedTracker导入到我们自己的工程中,这之中的FdActivity相当于相机界面,这里注意不要改动包名,否则可能会出现找不到本地方法的错误。同时,我们要将jni和Lib armead目录复制到我们的目录里,之后我们要利用Eclipse自动编译NDK/JNI。下面简单介绍一下自动编译的方法:
1.将Android项目转换为C/C++项目,如下图,New -> Other -> C/C++ -> Convert to a C/C++ Project.

2. 配置NDK编译路径,Project->Properties,如下图,其中Build-Command中ANDROID_NDK为环境变量中配置的Android-NDK路径;Build-Directory为当前工程目录

3.Project->Properties,CNU C和GNU C++中配置OpenCV的链接库

配置完指后,我们需要稍微修改一下我们自己创建的opencvLibrary的内容。因为camera中出现人脸框后需要拍照功能,我们需要简单的修改OpenCvLibrary中的JavaCameraView,在这个类里面我们可以调用camera的takepicture方法。同时通过PictureCallback将我们拍的照片保存到我们指定的路径。 ``` mCamera.takePicture(mShutterCallback, null, mJpegPictureCallback); ShutterCallback mShutterCallback = new ShutterCallback() { public void onShutter() { } };

PictureCallback mJpegPictureCallback = new PictureCallback()
{public void onPictureTaken(byte[] data, Camera camera) {Log.d("hr", "拍照回调");Bitmap b = null;if (null != data) {b = BitmapFactory.decodeByteArray(data, 0, data.length);mCamera.stopPreview();}if (null != b) {Bitmap rotaBitmap = ImageUtil.getRotateBitmap(b, 00.0f);boolean bitmap = FileUtil.saveBitmap(rotaBitmap,idTag);if (bitmap) {if (handler!=null) {handler.sendEmptyMessage(2000);}      }}mCamera.startPreview();}};
  <font size=2>在FdActivity的 onCameraFramed中 facesArray 得长度 即是人脸显示的数目</font>

Rect[] facesArray = faces.toArray();
for (int i = 0; i < facesArray.length; i++)
Imgproc.rectangle(mRgba, facesArray[i].tl(), facesArray[i].br(), FACE_RECT_COLOR, 3);

 <font size=2>当相机捕捉到人脸后,我们可以通过handle自动拍照也可以手动拍照,这就看具体的需求了。保存图片之后,我们调用百度的接口,根据返回值来判断人体的相似度。</font>
        url = new URL(urlPath);Bitmap bmp = FileUtil.getValidateBitmap();ByteArrayOutputStream baos = new ByteArrayOutputStream();bmp.compress(Bitmap.CompressFormat.JPEG, 100, baos);try {baos.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}byte[] buffer = baos.toByteArray();// 将图片的字节流数据加密成base64字符输出String photo = Base64.encodeToString(buffer, 0, buffer.length,Base64.DEFAULT);HashMap<String, String> map=new HashMap<String, String>();map.put("uid", uid);map.put("group_id", groupid);map.put("image", photo);map.put("ext_fields", "faceliveness");String str=HttpClientUtil.doPost(urlPath, map);

``
获取验证和注册的方式代码基本上一样,就是发送普通的网络请求,我们根据返回值可以判断出人脸是否一致。至此整个人脸验证流程就算结束了。我这里就光展示一下动态检测人脸的效果

当然还有认证的流程,因为感觉难点主要在动态识别人脸这块,所以调用百度的接口,实现人脸识别的过程就不再详细介绍了。当然 ,还有一些小问题,当竖屏时,检测不准确或者Camera界面没有全屏, 或者是前置摄像头的开启。大家有兴趣的话可以去研究一下。
最后附带上我的demo地址,http://download.csdn.net/download/qq_28931623/10167057
Github地址: https://github.com/huangruiLearn/FaceCheck

Android Camera动态人脸识别+人脸检测基于OpenCV(无需OpenCVManager)相关推荐

  1. tomcat+jsp IDEA 在线人脸识别 寻找系统 基于openCV

    也可以叫软院寻人(2022年3月22日更新完毕) 2021年11月15日补充了BufferedImage转Mat类(便于上传后比较) 某工J2EE大作业 在线搜索+人脸识别 首先要做的事 1.下载op ...

  2. linux opencv 人脸识别,iOS下 基于OpenCV实现的人脸识别匹配

    OpenCV是什么 OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux.Windows.Android和Mac OS操作系统上.它轻量级而且高效--由一系列 C 函 ...

  3. 【优秀课设】基于OpenCV的Python人脸识别、检测、框选(遍历目录下所有照片依次识别 视频随时标注)

    基于OpenCV的Python人脸识别.检测.框选 (遍历目录下所有照片依次识别 视频随时标注) 移步: https://blog.csdn.net/weixin_53403301/article/d ...

  4. android 人脸识别 方法研究,基于Android平台的人脸识别技术研究

    摘要: 在计算机视觉与模式识别领域中,人脸检测与识别技术是一个非常热门的研究课题,同时也具备非常广阔的商业价值.在诸多的目标检测算法中,基于AdaBoost算法的目标检测方法具有检测速度快,检测效果好 ...

  5. 基于PCA 人脸识别/人脸识别算法/人脸检测程序源码MATLAB ELM+PCA人脸识别 PCA人脸识别matlab代码 基于PCA算法的人脸识别

    1.基于PCA的人脸识别代码 2.MATLAB ELM+PCA人脸识别 2.基于PCA的人脸识别(matlab)(采用PCA算法进行人脸识别,通过抽取人脸的主要成 分,构成特征脸空间,识别时将测试图像 ...

  6. CV之FR之MTCNN:基于TF框架利用MTCNN算法检测并对齐人脸图像进(人脸识别/人脸相似度)而得出人脸特征向量从而计算两张人脸图片距离案例应用之详细攻略

    CV之FR之MTCNN:基于TF框架利用MTCNN算法检测并对齐人脸图像进(人脸识别/人脸相似度)而得出人脸特征向量从而计算两张人脸图片距离案例应用之详细攻略 目录 基于TF框架利用MTCNN算法检测 ...

  7. 人脸识别微笑检测(基于卷积神经网络CNN)

    目录 一.卷积神经网络概述 二.图片预处理 三.划分数据集 四.CNN提取人脸识别笑脸和非笑脸 参考资料 一.卷积神经网络概述 卷积神经网络(Convolutional Neural Networks ...

  8. 百度AI人脸识别与检测二:学生人脸识别打卡签到系统主界面功能需求和设计以及通过Python实现界面运行

    <百度AI人脸识别与检测>专栏为项目专栏,从零到一,从无到有开发一个学生人脸识别签到系统:主要用到的技术有百度开放平台中的人脸检测.人脸识别.Python图形界面开发PyQt5.线程的管理 ...

  9. 树莓派人脸识别_童话树莓派|(十一)进入AI世界人脸识别(防疫检测)

    童话树莓派 第十一集-进入AI世界-人脸识别(防疫检测) [人脸识别+口罩检测] 小朋友们,很快又见面了 今天我们继续进入AI人工智能世界,探寻人脸识别的奥秘 你看起来多少岁呢? 你看起来是男的还是女 ...

  10. 百度AI人脸识别与检测一:学生人脸识别签到系统简介及百度AI开放平台账号注册和人脸实例应用创建

    <百度AI人脸识别与检测>专栏为项目专栏,从零到一,从无到有开发一个学生人脸识别签到系统:主要用到的技术有百度开放平台中的人脸检测.人脸识别.Python图形界面开发PyQt5.线程的管理 ...

最新文章

  1. SurfaceView 间取得焦点
  2. 【内核】linux内核启动流程详细分析
  3. linux一条命令添加用户并设置密码,linux中如何通过命令行来添加用户并设置密码...
  4. HTTP相关知识 - 1
  5. 作为程序员,这些梗你都答得上来吗?
  6. ResNet才是YYDS!新研究:不用蒸馏、无额外数据,性能还能涨一波
  7. 车辆工程用得到python吗_如今车辆工程真的不如以前了吗?
  8. html对图片轮播脚本怎么调用,【jquery前端开发】可调整的幻灯片(图片轮播)
  9. mysql 手动执行event_MYSQL 定时自动执行EVENT
  10. VS2010 修改模板文件,增加默认注释
  11. nodejs 前端 返回数组给_互联网寒冬,一年经验字节跳动、虾皮、快手、拼多多前端面试总结...
  12. 红豆、绿豆、黑豆、花生、莲子、薏仁米放在一起吃,可以吗?
  13. 损失函数与代价函数区别
  14. java毕业设计校园博客系统mybatis+源码+调试部署+系统+数据库+lw
  15. VMWare 装mac os x 一个必备优化神器 beamoff
  16. 华为搜索引擎Petal与Google的区别
  17. 笔记本电脑禁用自带键盘
  18. python海龟模块制作的星空飞碟大战_python精灵模块
  19. android调用微信视频电话,微信视频通话录屏如何操作
  20. Jmeter之常用断言总结篇

热门文章

  1. iic总线从机仲裁_对 IIC 总线的理解、调用函数以及常见面试问题
  2. Typecho 插件开发基础
  3. 求字符串长度的函数的几种实现方法
  4. 2019“华为杯”第十六届研究生数模竞赛F题一等奖7/2790方案
  5. Win10开启高性能、卓越性能模式的方法
  6. eclipse 工具翻译插件安装
  7. 程序员也要学英语——带你理清英语语法思路
  8. 职场中,什么样的人最容易升职?
  9. 数据结构-单链表LNode,*LinkList
  10. Java保留2位小数 JS保留2位小数 Java截取2位小数 Math.round((1.0/3)*100)/100.0