Android中的人脸检测(静态和动态)

(1)背景。

Google 于2006年8月收购Neven Vision 公司 (该公司拥有10多项应用于移动设备领域的图像识别的专利),以此获得了图像识别的技术,并加入到android中。Android 中的人脸识别技术,用到的底层库:android/external/neven/,framework 层:frameworks/base/media/java/android/media/FaceDetector.java。

Java 层接口的限制:A,只能接受Bitmap 格式的数据;B,只能识别双眼距离大于20 像素的人脸像(当然,这个可在framework层中修改);C,只能检测出人脸的位置(双眼的中心点及距离),不能对人脸进行匹配(查找指定的脸谱)。

人脸识别技术的应用:A,为Camera 添加人脸识别的功能,使得Camera 的取景器上能标识出人脸范围;如果硬件支持,可以对人脸进行对焦。B,为相册程序添加按人脸索引相册的功能,按人脸索引相册,按人脸分组,搜索相册。

(2)Neven库给上层提供的主要方法: A,android.media.FaceDetector .FaceDetector(int width, int height, int maxFaces):Creates a FaceDetector, configured with the size of the images to be analysed and the maximum number of faces that can be detected. These parameters cannot be changed once the object is constructed.

B,int android.media.FaceDetector .findFaces(Bitmap bitmap, Face [] faces):Finds all the faces found in a given Bitmap . The supplied array is populated with FaceDetector.Face s for each face found. The bitmap must be in 565 format (for now).

(3)静态图片处理代码实例:

通过对位图的处理,捕获位图中的人脸,并以绿框显示,有多个人脸就提示多个绿框。首先新建一个activity,由于位图资源会用代码显示出来,所以不需在layout中使用widget。

package com.example.mydetect2;import android.os.Bundle;import android.app.Activity;import android.util.Log;import android.view.Menu;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.view.View; public class MainActivity2 extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//setContentView(R.layout.activity_main_activity2);setContentView(new myView(this));//使用自建的view来显示Log.i("zhangcheng","MainActivity2 run here");}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){//view类的构造函数,必须有super(context);BitmapFactory.Options BitmapFactoryOptionsbfo = new BitmapFactory.Options();BitmapFactoryOptionsbfo.inPreferredConfig = Bitmap.Config.RGB_565;//构造位图生成的参数,必须为565。类名+enummyBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.baby, BitmapFactoryOptionsbfo);imageWidth = myBitmap.getWidth();imageHeight = myBitmap.getHeight();myFace = new FaceDetector.Face[numberOfFace]; //分配人脸数组空间myFaceDetect = new FaceDetector(imageWidth, imageHeight, numberOfFace);numberOfFaceDetected = myFaceDetect.findFaces(myBitmap, myFace); //FaceDetector 构造实例并解析人脸Log.i("zhangcheng","numberOfFaceDetected is " + numberOfFaceDetected);}protected void onDraw(Canvas canvas){//override函数,必有canvas.drawBitmap(myBitmap, 0, 0, null);//画出位图Paint myPaint = new Paint();myPaint.setColor(Color.GREEN);myPaint.setStyle(Paint.Style.STROKE);myPaint.setStrokeWidth(3); //设置位图上paint操作的参数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),(int)(myMidPoint.y – myEyesDistance),(int)(myMidPoint.x + myEyesDistance),(int)(myMidPoint.y + myEyesDistance),myPaint);}}}}

以上为activity,工程的xml文件没有什么特殊地方。最后得到的结果如下,图片资源是png的也可以。

(4) 动态预览识别人脸代码实例

该过程用于后台工作,没有界面也没有预览。所以没有采用上面那种处理位图资源的方式。Import的类就不列出了,核心的代码和流程如下:

A,打开摄像头,获得初步摄像头回调数据,用到是setpreviewcallback

protected Camera mCameraDevice = null;// 摄像头对象实例

private long mScanBeginTime = 0; // 扫描开始时间private long mScanEndTime = 0; // 扫描结束时间private long mSpecPreviewTime = 0; // 扫描持续时间

private int orientionOfCamera ; //前置摄像头layout角度

或许是某个未开发的荒凉小岛,或许是某座闻名遐迩的文化古城。

Android中的人脸检测(静态和动态)

相关文章:

你感兴趣的文章:

标签云: