Heguming

Heguming

0个粉丝

8

问答

0

专栏

6

资料

Heguming  发布于  2015-11-06 14:22:10
采纳率 0%
8个问答
4598

关于人脸识别的实例

本帖最后由 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对象,即可完成对图像的人脸识别及绘制。

       效果如下:

      

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

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

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

      原创,转载请注明出处。

      附件:FaceDistinguish.rar        
易百纳技术社区文件: FaceDistinguish.rar
下载
我来回答
回答2个
时间排序
认可量排序

xihua

0个粉丝

6

问答

0

专栏

0

资料

xihua 2018-04-24 16:25:09
认可0
大神,您这个人脸识别是基于什么硬件做出来的,能透露下吗?

lishiqi

0个粉丝

19

问答

0

专栏

0

资料

lishiqi 2019-06-12 16:01:34
认可0
这个是人脸检测!还是Android的!
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
举报反馈

举报类型

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

详细说明

易百纳技术社区