关于人脸识别的实例
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]
分享一个人脸识别的实例,已将其封装成一个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]
展开》
折叠》