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

Android编程示例之——人像检测

2011-09-07 18:17 176 查看
Android提供了FaceDetector用于检测人像。但是这个仅仅提供检测,也就是说只能判断这个图片是不是人。

至于识别具体是哪个人还没有实现。

Activity实现:

package xuxing.imageprocessing.facedetect;

import android.app.Activity;

import android.os.Bundle;

public class FaceDetectExampleActivity extends Activity {

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

FaceView faceView = new FaceView(this);

setContentView(faceView);

}

}

FaceView实现:

package xuxing.imageprocessing.facedetect;

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.graphics.Rect;

import android.media.FaceDetector;

import android.util.Log;

import android.view.View;

public class FaceView extends View {

private static final int NUM_FACES = 10; // max is 64

private static final boolean DEBUG = true;

private FaceDetector arrayFaces;

private FaceDetector.Face getAllFaces[] = new FaceDetector.Face[NUM_FACES];

private FaceDetector.Face getFace = null;

private PointF eyesMidPts[] = new PointF[NUM_FACES];

private float eyesDistance[] = new float[NUM_FACES];

private Bitmap sourceImage;

private Paint tmpPaint = new Paint(Paint.ANTI_ALIAS_FLAG);

private Paint pOuterBullsEye = new Paint(Paint.ANTI_ALIAS_FLAG);

private Paint pInnerBullsEye = new Paint(Paint.ANTI_ALIAS_FLAG);

private int picWidth, picHeight;

private float xRatio, yRatio;

public FaceView(Context context) {

super(context);

pInnerBullsEye.setStyle(Paint.Style.FILL);

pInnerBullsEye.setColor(Color.RED);

pOuterBullsEye.setStyle(Paint.Style.STROKE);

pOuterBullsEye.setColor(Color.RED);

tmpPaint.setStyle(Paint.Style.STROKE);

tmpPaint.setTextAlign(Paint.Align.CENTER);

BitmapFactory.Options bfo = new BitmapFactory.Options();

bfo.inPreferredConfig = Bitmap.Config.RGB_565;

sourceImage = BitmapFactory.decodeResource(getResources(),

R.drawable.linyichen2, bfo);

picWidth = sourceImage.getWidth();

picHeight = sourceImage.getHeight();

arrayFaces = new FaceDetector(picWidth, picHeight, NUM_FACES);

arrayFaces.findFaces(sourceImage, getAllFaces);

for (int i = 0; i < getAllFaces.length; i++) {

getFace = getAllFaces[i];

try {

PointF eyesMP = new PointF();

getFace.getMidPoint(eyesMP);

eyesDistance[i] = getFace.eyesDistance();

eyesMidPts[i] = eyesMP;

if (DEBUG) {

Log.i("Face", i + " " + getFace.confidence() + " "

+ getFace.eyesDistance() + " " + "Pose: ("

+ getFace.pose(FaceDetector.Face.EULER_X) + ","

+ getFace.pose(FaceDetector.Face.EULER_Y) + ","

+ getFace.pose(FaceDetector.Face.EULER_Z) + ")"

+ "Eyes Midpoint: (" + eyesMidPts[i].x + ","

+ eyesMidPts[i].y + ")");

}

} catch (Exception e) {

if (DEBUG)

Log.e("Face", i + " is null");

}

}

}

@Override

protected void onDraw(Canvas canvas) {

xRatio = getWidth() * 1.0f / picWidth;

yRatio = getHeight() * 1.0f / picHeight;

canvas.drawBitmap(sourceImage, null, new Rect(0, 0, getWidth(),

getHeight()), tmpPaint);

for (int i = 0; i < eyesMidPts.length; i++) {

if (eyesMidPts[i] != null) {

pOuterBullsEye.setStrokeWidth(eyesDistance[i] / 6);

canvas.drawCircle(eyesMidPts[i].x * xRatio, eyesMidPts[i].y

* yRatio, eyesDistance[i] / 2, pOuterBullsEye);

canvas.drawCircle(eyesMidPts[i].x * xRatio, eyesMidPts[i].y

* yRatio, eyesDistance[i] / 6, pInnerBullsEye);

}

}

}

}

参考链接:http://www.anddev.org/quick_and_easy_facedetector_demo-t3856.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: