您的位置:首页 > 移动开发 > Android开发

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:

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);
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: