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 imageWidthimageHeight;

        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(imageWidthimageHeightnumberOfFace);

            numberOfFaceDetected = myFaceDetect.findFaces(myBitmapmyFace);

        }

 

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

            }

        }

    }

}

 

本文转自feisky博客园博客,原文链接:http://www.cnblogs.com/feisky/archive/2010/09/12/1824320.html,如需转载请自行联系原作者


相关文章
|
4月前
|
XML Java Android开发
Android Studio App开发之列表类视图中基本适配器BaseAdapter的使用及实战(附源码 超详细)
Android Studio App开发之列表类视图中基本适配器BaseAdapter的使用及实战(附源码 超详细)
47 0
|
6月前
|
Android开发
安卓项目之纸牌游戏之四 游戏规则类
安卓项目之纸牌游戏之四 游戏规则类
43 0
|
8月前
|
Android开发
Android 中实现特殊符号㎡ 的显示 使用SpannableString类来实现
Android 中实现特殊符号㎡ 的显示 使用SpannableString类来实现
32 0
|
8月前
|
Java Android开发
Android 中通过Intent传递类对象,通过实现Serializable和Parcelable接口两种方式传递对象
Android 中通过Intent传递类对象,通过实现Serializable和Parcelable接口两种方式传递对象
77 1
|
8月前
|
Android开发
Android Log类中方法的使用
Android Log类中方法的使用
60 0
|
9月前
|
存储 Rust JavaScript
现代化 Android 开发:数据类
本文为现代化 Android 开发系列文章第二篇。
106 0
|
10月前
|
Java Android开发
Java、Android 新建类自动添加头部注释以及如何添加函数注释模板和快捷键
Java、Android 新建类自动添加头部注释以及如何添加函数注释模板和快捷键
|
10月前
|
存储 XML JSON
Android操作配置文件封装类,使用json序列化的方式实现
Android操作配置文件封装类,使用json序列化的方式实现
|
10月前
|
安全 Android开发
Android 动态权限 permission 操作类简单封装
Android 动态权限 permission 操作类简单封装
|
10月前
|
Java 开发工具 Android开发
Android修改aar包中的类文件并重新打包
Android修改aar包中的类文件并重新打包
799 0