最近由于项目需要,得给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_565, true ) ; 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. y, 20, p ) ; canvas. drawCircle (eyeRight. x, eyeRight. y, 20, p ) ; canvas. drawRect (faceRect, p ) ; } } |
源码下载: Android静态人脸识别源码
转载请注明:Shirlman » Android静态人脸识别(附源码)
博客地址:www.shirlman.com