android人脸识别技术浅析

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/cjnewstar111/article/details/7599981
        今天小小的研究了一下android自带的人脸识别技术的API。这里做一下总结。
        首先明白android提供的这套接口功能是比较弱的,它是通过检测两个眼睛的存在来判断是否存在人脸,所以对于侧身的,戴眼镜的人脸识别效果不佳。在使用上面主要是两个类,一个是FaceDetector,这个类是最主要的,它里面有完成检测识别的具体方法。另外一个类就是FaceDetector.Face。这是FaceDetect的内部类,主要用来存放最后检测到的人脸的坐标信息。
        使用步骤:
        第一步、把要检测的bitmap转换成RGB565格式的
              这个是必须的,这套API只能对RGB565格式的做识别。转换代码如下
              BitmapFactory.Options BitmapFactoryOptionsbfo = new BitmapFactory.Options();
              BitmapFactoryOptionsbfo.inPreferredConfig = Bitmap.Config.RGB_565;
              myBitmap = BitmapFactory.decodeResource(你要转换的bitmap, BitmapFactoryOptionsbfo);
        第二步、生成一个新的FaceDetector对象需要传入待检测位图的宽和高,以及最多检测几张人脸。
                myFaceDetect = new FaceDetector(imageWidth, imageHeight, numberOfFace); //imageWidth是待检测位图的宽,imageHeight是待检测位图的高,n                umberOfFace是最多检测几张人脸。
        第三步、开始检测
                当然在检测前必须创建FaceDetect.Face对象。通常会创建一个数组。
                myfaces = new FaceDetect.Face【num】;
                int num = myFaceDetect .findFace(bitmap , myfaces);返回值是实际检测到的人脸数目。
       第四步、绘制脸部方框
                 这一步,主要是看你识别出来之后做什么用了。识别出来的人脸信息存放在myfaces数组中,包含着每张人脸的眼睛中点坐标以及眼睛距离。如果要把识别出来的信息                 在视图上绘制出来,那么就可以绘制方框图。使用myfaces元素的face.getMidPoint()方法可以获得中点坐标;eyesDistance()方法可以获得人眼之间的距离。
       下面是一个简单的源码。
      package star.app.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.media.FaceDetector;
import android.media.FaceDetector.Face;
import android.view.View;


public class ViewMain extends View{
private int imageWidth, imageHeight;
        private int numberOfFace = 5;
        private FaceDetector myFaceDetect;
        private FaceDetector.Face[] myFace;
        float myEyesDistance;
        int numberOfFaceDetected;
        Bitmap myBitmap;
  
        public ViewMain(Context context) {  
            super(context);
            BitmapFactory.Options BitmapFactoryOptionsbfo = new BitmapFactory.Options();
            BitmapFactoryOptionsbfo.inPreferredConfig = Bitmap.Config.RGB_565;
            myBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.test, 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.RED);
            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+30)),
                        myPaint);
            }
        }
    }

猜你喜欢

转载自blog.csdn.net/cjnewstar111/article/details/7599981