Android人脸检测类FaceDetector

根据文档描述,输入图片必须为Bitmap RGB565格式。

 

人脸的检测方法是用双眼来检测人脸的位置,也就是说无法检测到嘴、侧脸等,双眼必须同时可见,并且眼镜会影响检测的效果。

 

实际上,FaceDetector检测到的并不是人的全脸,而只是双眼。

 

实际测试中,发现图片太小的话检测不到人脸,试验中使用小于100x100的图片检测不到人脸,但是由于Android内存有限,图片太大的话,会出现无法加载图片的异常。

 

检测到的人脸存放到FaceDetector.Face类中,该类无法再扩展。从该类可以获取到人眼的中心位置和双眼之间的具体。

package name.feisky.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 AndroidFaceDetector 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.pp, 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),
(
int)(myMidPoint.y - myEyesDistance),
(
int)(myMidPoint.x + myEyesDistance),
(
int)(myMidPoint.y + myEyesDistance),
myPaint);
}
}
}
}

 

 

posted @ 2010-09-14 10:30  Me疯子_(~  阅读(158)  评论(0编辑  收藏  举报