Android入门笔记之人脸识别初学
2013-10-26 16:45
302 查看
<1>简介
Android4.0自带的人脸识别技术只能识别出人脸在画面中的位置,中心点,眼间距,角度等基本特性,提供给上层应用使用。
Google 于2006年8月收购Neven Vision
公司(该公司拥有 10 多项应用于移动设备领域的图像识别的专利),以此获得了图像识别的技术,并很快应用到免费的 Picasa 相册管理程序中,提供基于人脸识别的相片管理功能,另外还推出了一个新项目叫Goggle,能从照片中识别世界各地的地标建筑,同样Google
也把人脸识别功能添加到了Android 中。不过由于个人隐私等相关因素,GoogleGoggles好像暂时屏蔽了人脸识别功能。
2. Android 中的人脸识别技术
底层库:android/external/neven/
framework层:frameworks/base/media/java/android/media/FaceDetector.java
Java 层接口的限制:
只能识别双眼距离大于 20 像素的人脸像(当然,这个可在framework层中修改);只能检测出人脸的位置(双眼的中心点及距离);不能对人脸进行匹配(查找指定的脸谱)
根据文档描述,输入图片必须为Bitmap RGB565格式。
人脸的检测方法是用双眼来检测人脸的位置,也就是说无法检测到嘴、侧脸等,双眼必须同时可见,并且眼镜会影响检测的效果。
实际上,FaceDetector检测到的并不是人的全脸,而只是双眼。
实际测试中,发现图片太小的话检测不到人脸,试验中使用小于100x100的图片检测不到人脸,但是由于Android内存有限,图片太大的话,会出现无法加载图片的异常。
总结:
Android对于人脸识别的支持还不是特别成熟。期待下一版本的改进。
<2>关键步骤
myFace = newFaceDetector.Face[numberOfFace];
//新建一个人脸数组
myFaceDetect = newFaceDetector(imageWidth, imageHeight, numberOfFace);
//根据图像的长宽及最大人脸数初始化
numberOfFaceDetected= myFaceDetect.findFaces(myBitmap, myFace);
//调用方法自动找到人脸
<3>出现的问题
源码地址:http://download.csdn.net/detail/gmj4850/6457615
<4>代码及解释
MainActivity:
Android4.0自带的人脸识别技术只能识别出人脸在画面中的位置,中心点,眼间距,角度等基本特性,提供给上层应用使用。
Google 于2006年8月收购Neven Vision
公司(该公司拥有 10 多项应用于移动设备领域的图像识别的专利),以此获得了图像识别的技术,并很快应用到免费的 Picasa 相册管理程序中,提供基于人脸识别的相片管理功能,另外还推出了一个新项目叫Goggle,能从照片中识别世界各地的地标建筑,同样Google
也把人脸识别功能添加到了Android 中。不过由于个人隐私等相关因素,GoogleGoggles好像暂时屏蔽了人脸识别功能。
2. Android 中的人脸识别技术
底层库:android/external/neven/
framework层:frameworks/base/media/java/android/media/FaceDetector.java
Java 层接口的限制:
只能识别双眼距离大于 20 像素的人脸像(当然,这个可在framework层中修改);只能检测出人脸的位置(双眼的中心点及距离);不能对人脸进行匹配(查找指定的脸谱)
根据文档描述,输入图片必须为Bitmap RGB565格式。
人脸的检测方法是用双眼来检测人脸的位置,也就是说无法检测到嘴、侧脸等,双眼必须同时可见,并且眼镜会影响检测的效果。
实际上,FaceDetector检测到的并不是人的全脸,而只是双眼。
实际测试中,发现图片太小的话检测不到人脸,试验中使用小于100x100的图片检测不到人脸,但是由于Android内存有限,图片太大的话,会出现无法加载图片的异常。
总结:
Android对于人脸识别的支持还不是特别成熟。期待下一版本的改进。
<2>关键步骤
myFace = newFaceDetector.Face[numberOfFace];
//新建一个人脸数组
myFaceDetect = newFaceDetector(imageWidth, imageHeight, numberOfFace);
//根据图像的长宽及最大人脸数初始化
numberOfFaceDetected= myFaceDetect.findFaces(myBitmap, myFace);
//调用方法自动找到人脸
<3>出现的问题
源码地址:http://download.csdn.net/detail/gmj4850/6457615
<4>代码及解释
MainActivity:
package com.face; import android.app.Activity; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.PointF; import android.media.FaceDetector; import android.media.FaceDetector.Face; import android.os.Bundle; import android.view.View; public class MainActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(new myView(this)); } private class myView extends View{ private int imageWidth, imageHeight; private int numberOfFace = 5; private FaceDetector myFaceDetect; private FaceDetector.Face[] myFace; float myEyesDistance; int numberOfFaceDetected; Bitmap myBitmap; public myView(Context context) { super(context); BitmapFactory.Options BitmapFactoryOptionsbfo = new BitmapFactory.Options(); BitmapFactoryOptionsbfo.inPreferredConfig = Bitmap.Config.RGB_565; myBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.a2, BitmapFactoryOptionsbfo); imageWidth = myBitmap.getWidth(); imageHeight = myBitmap.getHeight(); myFace = new FaceDetector.Face[numberOfFace]; myFaceDetect = new FaceDetector(imageWidth, imageHeight, numberOfFace); numberOfFaceDetected = myFaceDetect.findFaces(myBitmap, myFace); } protected void onDraw(Canvas canvas) { // TODO Auto-generated method stub canvas.drawBitmap(myBitmap, 0, 0, null); Paint myPaint = new Paint(); myPaint.setColor(Color.GREEN); myPaint.setStyle(Paint.Style.STROKE); myPaint.setStrokeWidth(3); for(int i=0; i < numberOfFaceDetected; i++) { Face face = myFace[i]; PointF myMidPoint = new PointF(); face.getMidPoint(myMidPoint); myEyesDistance = face.eyesDistance(); canvas.drawRect( (int)(myMidPoint.x - myEyesDistance*2), (int)(myMidPoint.y - myEyesDistance*2), (int)(myMidPoint.x + myEyesDistance*2), (int)(myMidPoint.y + myEyesDistance*2), myPaint); } } } }
相关文章推荐
- Android 初学入门代码注释 学习笔记001 16.03.18
- Android人脸识别开发入门--基于虹软免费SDK实现
- Android初学----自己封装集成讯飞语音和人脸识别
- Android人脸识别开发入门–基于虹软免费SDK实现
- 程序员的机器学习入门笔记(十一):简单人脸识别系统实践
- Android_(入门篇)整理笔记
- Android初学笔记——内部存储器的读写
- 人脸识别技术入门
- 【Android】【笔记】《Android 入门经典》part 13 网络通信技术
- Android入门笔记之Fragment
- Android开发笔记(一百五十)自动识别验证码图片
- OpenCV学习笔记(五十五)——用OpenCV做人脸识别和性别识别contrib
- 在Android上使用ZXing识别条码 二次开发笔记 (2)
- Android笔记二十八.Service组件入门(二).绑定本地Service并与之通信
- Android人脸识别Demo竖屏YUV方向调整和图片保存(分享)
- Android USB入门笔记
- Android入门学习笔记(二):Android开发环境的搭建
- 一天入门 Android App开发 笔记
- Opencv4Android人脸识别之opencv_contrib编译
- Android: NDK编程入门笔记