Android入门笔记之人脸识别初学

来源:互联网 发布:网络存储服务器 编辑:程序博客网 时间:2024/04/30 07:22

<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);            }        }    }}

原创粉丝点击