关于人脸识别的实例

 2 E币 
成为会员,免费下载资料
文件大小:719.53 KB 上传者:Heguming 时间:2015-11-06 14:22:00 下载量:12
本帖最后由 Heguming 于 2015-11-6 14:22 编辑

        分享一个人脸识别的实例,已将其封装成一个FaceDistinguishClass类,附件中为该类的应用实例。

        [code]
        package com.example.facedistinguish;

import android.content.Context;
import android.graphics.Bitmap;
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 FaceDistinguishClass extends View {

        private Bitmap bitmap;
        private float imageWidth;
        private float imageHeight;
        private FaceDetector faceDetector;
        private FaceDetector.Face[] faces;
        private int faceDetectedNumber = 0;
        private static final int FACENUMBER = 100;

        public FaceDistinguishClass(Context context, Bitmap bitmap) {

                super(context);
                this.bitmap = bitmap;
                imageWidth = bitmap.getWidth();
                imageHeight = bitmap.getHeight();
                faces = new FaceDetector.Face[FACENUMBER];
                faceDetector = new FaceDetector((int) imageWidth, (int) imageHeight,
                                FACENUMBER);
                faceDetectedNumber = faceDetector.findFaces(bitmap, faces);
        }

        public void onDraw(Canvas canvas) {
                // TODO Auto-generated method stub
                canvas.drawBitmap(bitmap, 0, 0, null);
                Paint paint = new Paint();
                paint.setColor(Color.GREEN);
                paint.setStyle(Paint.Style.STROKE);
                paint.setStrokeWidth(3);

                for (int i = 0; i < faceDetectedNumber; i++) {
                        Face face = faces;
                        PointF pointF = new PointF();
                        face.getMidPoint(pointF);
                        float myEyesDistance = face.eyesDistance();
                        canvas.drawRect((int) (pointF.x - myEyesDistance * 2),
                                        (int) (pointF.y - myEyesDistance * 2),
                                        (int) (pointF.x + myEyesDistance * 2),
                                        (int) (pointF.y + myEyesDistance * 2), paint);
                }
        }

        public int getFaceNumber() {
                return faceDetectedNumber;
        }
}
        [/code]

        该类通过构造函数FaceDistinguishClass(Context context, Bitmap bitmap)接收传入的Bitmap对象,然后实例化一个FaceDetector对象用于人脸识别。通过调用FaceDetector.findFaces(Bitmap bitmap,  FaceDetector.Face[] faces)方法获取人脸识别数量,赋值给faceDetectedNumber变量。

        在onDraw(Canvas canvas)方法中,先通过Canvas.drawBitmap(Bitmap bitmap, float left, float top, Paint paint)方法,绘制出该图片视图,后通过Canvas.drawRect(float left, float top, float right, float bottom, Paint paint)方法,在每个识别出的人脸四周,绘制出一个矩形方框。最后,如果需要,可通过调用getFaceNumber()方法获取返回的人脸识别数量。

       使用时,用户只需在相应位置实例化一个FaceDistinguishClass对象,仍后传入需要识别的Bitmap对象,即可完成对图像的人脸识别及绘制。

       效果如下:

      [attach]3012[/attach]

      不知细心的读者有没有发现,在图片的右下角,有一位搂着孩子的母亲,并没有被人脸识别出来。通过调试,发现执行faceDetector.findFaces(bitmap, faces)方法后,获取的人脸数量有误,即少识别的了一个。

      "Ctrl" + MouseLeft 进入该方法,发现人脸识别数量,实际上是通过fft_detect(Bitmap bitmap)方法获取的。至于fft_detect(bitmap)方法,该方法为jni层方法,在FaceDistinguishClass 中,有如下声明:native private int  fft_detect(Bitmap bitmap)。

      由于jni层不可见,最终没有弄清未识别出的原因。不过通过函数名分析,极有可能是傅立叶变换出的问题。不知有哪位高手,可以帮忙找出这个原因。在下不胜感激!

      原创,转载请注明出处。

      [attach]3013[/attach]        
展开
折叠
1043
评论
共 0 个
内容存在敏感词
    易百纳技术社区暂无数据
相关资料
关于作者
易百纳技术社区
Heguming
贡献资料 6
易百纳技术社区 我上传的资料
登录查看
我赚取的积分
登录查看
我赚取的收益
登录查看
上传资料 赚取积分兑换E币
易百纳技术社区
删除原因
广告/SPAM
恶意灌水
违规内容
文不对题
重复发帖
置顶时间设置
结束时间
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-资料模块

审核失败

失败原因
备注
易百纳技术社区