快速使用Android静态人脸识别(附源码)

来源:互联网 发布:知乎 我也曾想一了百了 编辑:程序博客网 时间:2024/06/16 02:07

最近由于项目需要,得给Android添加人脸识别的功能,调研了一段时间,有跨平台的大名鼎鼎的OpenCV,不过在Android上太麻烦了,时间也紧张就没怎么弄,下面说下Android自带的人脸识别功能。

Android提供了两种人脸识别的功能:

1. 软件识别,支持静态和动态识别,比较消耗计算资源,处理速度慢,但是可以在绝大多数的手机上使用。

2. 硬件识别,仅支持动态识别,识别速度快,1秒可以识别10次左右,但是不是所有的Android设备都支持硬件识别。


 

今天先说下Android静态识别。

主要方法:

1
2
3
FaceDetector.Face[] faces = new FaceDetector.Face[N_MAX];
FaceDetector faceDetector = new FaceDetector(width, height, N_MAX);
detectedFaceCount = faceDetector.findFaces(this.faceBitmap, faces);


传入bitmap返回检测人脸的数量:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
private int detectFace(Bitmap bitmap)
{
Log.i(TAG, "Begin face detect");
if (bitmap == null)
{
bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.test);
}
this.faceBitmap = bitmap.copy(Config.RGB_565true);
int width = this.faceBitmap.getWidth();
int height = this.faceBitmap.getHeight();
Log.i(TAG, "待检测图像: w = " + width + ", h = " + height);
int detectedFaceCount = 0;
Log.i(TAG, "Start face detect");
FaceDetector.Face[] faces = new FaceDetector.Face[N_MAX];
FaceDetector faceDetector = new FaceDetector(width, height, N_MAX);
detectedFaceCount = faceDetector.findFaces(this.faceBitmap, faces);
Log.i(TAG, "检测到人脸:" + detectedFaceCount);
Log.i(TAG, "Stop face detect");
drawFaces(faces, detectedFaceCount);
Log.i(TAG, "End face detect");
return detectedFaceCount;
}

绘制人脸:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
private void drawFaces(FaceDetector.Face[] faces, int detectedFaceCount)
{
for (int i = 0; i < detectedFaceCount; i++)
{
Face f = faces[i];
PointF midPoint = new PointF();
float dis = f.eyesDistance();
f.getMidPoint(midPoint);
int dd = (int) (dis);
Point eyeLeft = new Point((int) (midPoint.x - dis / 2)(int) midPoint.y);
Point eyeRight = new Point((int) (midPoint.x + dis / 2)(int) midPoint.y);
Rect faceRect = new Rect((int) (midPoint.x - dd)(int) (midPoint.y - dd),
(int) (midPoint.x + dd)(int) (midPoint.y + dd));
Log.i(TAG, "左眼坐标 x = " + eyeLeft.x + ", y = " + eyeLeft.y);
Canvas canvas = new Canvas(this.faceBitmap);
Paint p = new Paint();
p.setAntiAlias(true);
p.setStrokeWidth(8);
p.setStyle(Paint.Style.STROKE);
p.setColor(Color.GREEN);
canvas.drawCircle(eyeLeft.x, eyeLeft.y20, p);
canvas.drawCircle(eyeRight.x, eyeRight.y20, p);
canvas.drawRect(faceRect, p);
}
}

源码下载: Android静态人脸识别源码

转载请注明:Shirlman » Android静态人脸识别(附源码)

博客地址:www.shirlman.com


0 0