美文网首页Android开发经验谈
安卓人脸检测之FaceDetector

安卓人脸检测之FaceDetector

作者: 李旭策 | 来源:发表于2017-08-24 17:11 被阅读0次

    最近看到一个APP的头像上传时,如果你设置的图片里面没有人脸,或者有两张以及以上人脸的时候,会提示你图片不符合规范,让你重新设置,这样是为了确保用户的头像是人!

    然后我就在网上查看了一下资料,发现谷歌原生Android里面提供了API,那就是我们今天要介绍的FaceDetector,下面我来给大家介绍一下:

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

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

    文档  findFaces(Bitmap bitmap, Face[] faces)方法中有说明。

    方法有

    float confidence() ;可信度(0-1)

    float eyesDistance(); 双眼的距离

    void getMidPoint(PointF point);设置双眼的中点

    float pose(int euler); 眼睛的pose,传入的为欧拉轴检索的角度。

    下面我们可以来写一个例子:

    public classFaceViewextendsImageView{

    public static finalStringTAG="FaceView";

    publicFaceView(Contextcontext) {

    super(context);

    init();

    }

    publicFaceView(Contextcontext,AttributeSetattrs) {

    super(context,attrs);

    init();

    }

    private intimageWidth,imageHeight;

    private intnumberOfFace=6;//最大检测的人脸数

    privateFaceDetectormyFaceDetect;//人脸识别类的实例

    privateFaceDetector.Face[]myFace;//存储多张人脸的数组变量

    floatmyEyesDistance;//两眼之间的距离

    intnumberOfFaceDetected;//实际检测到的人脸数

    BitmapmyBitmap;

    private voidinit() {

    BitmapFactory.OptionsBitmapFactoryOptionsbfo= newBitmapFactory.Options();

    BitmapFactoryOptionsbfo.inPreferredConfig=Bitmap.Config.RGB_565;//构造位图生成的参数,必须为565。类名+enum

    myBitmap=BitmapFactory.decodeResource(getResources(),R.mipmap.icon,BitmapFactoryOptionsbfo);

    imageWidth=myBitmap.getWidth();

    imageHeight=myBitmap.getHeight();

    myFace= newFaceDetector.Face[numberOfFace];//分配人脸数组空间

    myFaceDetect= newFaceDetector(imageWidth,imageHeight,numberOfFace);

    numberOfFaceDetected=myFaceDetect.findFaces(myBitmap,myFace);//FaceDetector 构造实例并解析人脸

    Log.i("lixuce","numberOfFaceDetected is "+numberOfFaceDetected);

    }

    /**

    * 对每个人脸进行画框

    */

    @Override

    protected voidonDraw(Canvascanvas) {

    canvas.drawBitmap(myBitmap,0,0,null);//画出位图

    PaintmyPaint= newPaint();

    myPaint.setColor(Color.GREEN);

    myPaint.setStyle(Paint.Style.STROKE);

    myPaint.setStrokeWidth(3);//设置位图上paint操作的参数

    for(inti=0;i

    FaceDetector.Faceface=myFace[i];

    PointFmyMidPoint= newPointF();

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

    }

    }

    }

    然后将这这个控件放入到xml文件里面就可以了,这样就可以识别出你提供的照片里面有多少张脸了,下面给大家看一下效果图:

    是不是觉得很神奇,大家一定要记得,你获取图片的bitmap的时候解码方式一定要用565,否则可能会闪退,或者检测不出来,好了就介绍到这里了,感兴趣的小伙伴赶紧去试一试吧!

    当你下定决心,准备前行的时候,剩下的只有坚持了。。。

    大家如果觉得我写的还可以的话,请关注我的微信公众号

    相关文章

      网友评论

        本文标题:安卓人脸检测之FaceDetector

        本文链接:https://www.haomeiwen.com/subject/tcvedxtx.html