版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
今天小小的研究了一下android自带的人脸识别技术的API。这里做一下总结。
首先明白android提供的这套接口功能是比较弱的,它是通过检测两个眼睛的存在来判断是否存在人脸,所以对于侧身的,戴眼镜的人脸识别效果不佳。在使用上面主要是两个类,一个是FaceDetector,这个类是最主要的,它里面有完成检测识别的具体方法。另外一个类就是FaceDetector.Face。这是FaceDetect的内部类,主要用来存放最后检测到的人脸的坐标信息。
使用步骤:
第一步、把要检测的bitmap转换成RGB565格式的。
这个是必须的,这套API只能对RGB565格式的做识别。转换代码如下
BitmapFactory.Options BitmapFactoryOptionsbfo = new BitmapFactory.Options();
BitmapFactoryOptionsbfo.inPreferredConfig = Bitmap.Config.RGB_565;
myBitmap = BitmapFactory.decodeResource(你要转换的bitmap, BitmapFactoryOptionsbfo);
第二步、生成一个新的FaceDetector对象,需要传入待检测位图的宽和高,以及最多检测几张人脸。
myFaceDetect = new FaceDetector(imageWidth, imageHeight, numberOfFace); //imageWidth是待检测位图的宽,imageHeight是待检测位图的高,n umberOfFace是最多检测几张人脸。
第三步、开始检测
当然在检测前必须创建FaceDetect.Face对象。通常会创建一个数组。
myfaces = new FaceDetect.Face【num】;
int num = myFaceDetect .findFace(bitmap , myfaces);返回值是实际检测到的人脸数目。
第四步、绘制脸部方框。
这一步,主要是看你识别出来之后做什么用了。识别出来的人脸信息存放在myfaces数组中,包含着每张人脸的眼睛中点坐标以及眼睛距离。如果要把识别出来的信息 在视图上绘制出来,那么就可以绘制方框图。使用myfaces元素的face.getMidPoint()方法可以获得中点坐标;eyesDistance()方法可以获得人眼之间的距离。
下面是一个简单的源码。
package star.app.facedetect;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
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 ViewMain extends View{
private int imageWidth, imageHeight;
private int numberOfFace = 5;
private FaceDetector myFaceDetect;
private FaceDetector.Face[] myFace;
float myEyesDistance;
int numberOfFaceDetected;
Bitmap myBitmap;
public ViewMain(Context context) {
super(context);
BitmapFactory.Options BitmapFactoryOptionsbfo = new BitmapFactory.Options();
BitmapFactoryOptionsbfo.inPreferredConfig = Bitmap.Config.RGB_565;
myBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.test, BitmapFactoryOptionsbfo);
imageWidth = myBitmap.getWidth();
imageHeight = myBitmap.getHeight();
myFace = new FaceDetector.Face[numberOfFace];
myFaceDetect = new FaceDetector(imageWidth, imageHeight, numberOfFace);
numberOfFaceDetected = myFaceDetect.findFaces(myBitmap, myFace);
}
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
canvas.drawBitmap(myBitmap, 0, 0, null);
Paint myPaint = new Paint();
myPaint.setColor(Color.RED);
myPaint.setStyle(Paint.Style.STROKE);
myPaint.setStrokeWidth(3);
for(int i=0; i < numberOfFaceDetected; i++)
{
Face face = myFace[i];
PointF myMidPoint = new PointF();
face.getMidPoint(myMidPoint);
myEyesDistance = face.eyesDistance();
canvas.drawRect(
(int)(myMidPoint.x - myEyesDistance),
(int)(myMidPoint.y - myEyesDistance),
(int)(myMidPoint.x + myEyesDistance),
(int)(myMidPoint.y + (myEyesDistance+30)),
myPaint);
}
}
}
首先明白android提供的这套接口功能是比较弱的,它是通过检测两个眼睛的存在来判断是否存在人脸,所以对于侧身的,戴眼镜的人脸识别效果不佳。在使用上面主要是两个类,一个是FaceDetector,这个类是最主要的,它里面有完成检测识别的具体方法。另外一个类就是FaceDetector.Face。这是FaceDetect的内部类,主要用来存放最后检测到的人脸的坐标信息。
使用步骤:
第一步、把要检测的bitmap转换成RGB565格式的。
这个是必须的,这套API只能对RGB565格式的做识别。转换代码如下
BitmapFactory.Options BitmapFactoryOptionsbfo = new BitmapFactory.Options();
BitmapFactoryOptionsbfo.inPreferredConfig = Bitmap.Config.RGB_565;
myBitmap = BitmapFactory.decodeResource(你要转换的bitmap, BitmapFactoryOptionsbfo);
第二步、生成一个新的FaceDetector对象,需要传入待检测位图的宽和高,以及最多检测几张人脸。
myFaceDetect = new FaceDetector(imageWidth, imageHeight, numberOfFace); //imageWidth是待检测位图的宽,imageHeight是待检测位图的高,n umberOfFace是最多检测几张人脸。
第三步、开始检测
当然在检测前必须创建FaceDetect.Face对象。通常会创建一个数组。
myfaces = new FaceDetect.Face【num】;
int num = myFaceDetect .findFace(bitmap , myfaces);返回值是实际检测到的人脸数目。
第四步、绘制脸部方框。
这一步,主要是看你识别出来之后做什么用了。识别出来的人脸信息存放在myfaces数组中,包含着每张人脸的眼睛中点坐标以及眼睛距离。如果要把识别出来的信息 在视图上绘制出来,那么就可以绘制方框图。使用myfaces元素的face.getMidPoint()方法可以获得中点坐标;eyesDistance()方法可以获得人眼之间的距离。
下面是一个简单的源码。
package star.app.facedetect;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
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 ViewMain extends View{
private int imageWidth, imageHeight;
private int numberOfFace = 5;
private FaceDetector myFaceDetect;
private FaceDetector.Face[] myFace;
float myEyesDistance;
int numberOfFaceDetected;
Bitmap myBitmap;
public ViewMain(Context context) {
super(context);
BitmapFactory.Options BitmapFactoryOptionsbfo = new BitmapFactory.Options();
BitmapFactoryOptionsbfo.inPreferredConfig = Bitmap.Config.RGB_565;
myBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.test, BitmapFactoryOptionsbfo);
imageWidth = myBitmap.getWidth();
imageHeight = myBitmap.getHeight();
myFace = new FaceDetector.Face[numberOfFace];
myFaceDetect = new FaceDetector(imageWidth, imageHeight, numberOfFace);
numberOfFaceDetected = myFaceDetect.findFaces(myBitmap, myFace);
}
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
canvas.drawBitmap(myBitmap, 0, 0, null);
Paint myPaint = new Paint();
myPaint.setColor(Color.RED);
myPaint.setStyle(Paint.Style.STROKE);
myPaint.setStrokeWidth(3);
for(int i=0; i < numberOfFaceDetected; i++)
{
Face face = myFace[i];
PointF myMidPoint = new PointF();
face.getMidPoint(myMidPoint);
myEyesDistance = face.eyesDistance();
canvas.drawRect(
(int)(myMidPoint.x - myEyesDistance),
(int)(myMidPoint.y - myEyesDistance),
(int)(myMidPoint.x + myEyesDistance),
(int)(myMidPoint.y + (myEyesDistance+30)),
myPaint);
}
}
}