Android动态人脸检测的示例代码(脸数可调)
人脸检测
这里的人脸检测并非人脸识别,但是却可以识别出是否有人,当有人时候,你可以将帧图进行人脸识别(这里推荐Face++的sdk),当然我写的demo中没有加入人脸识别,有兴趣的朋友可以追加。face++
android自带的人脸检测
这里我们用到了人脸检测类为FaceDetector.这个类提供了强大的人脸检测功能,可以方便我们进行人脸的侦测,因此我们使用他来进行动态的人脸检测,实现原理,其实也挺简单,主要是通过Carmen的回调PreviewCallback在其中对帧图进行操作,并通过FaceDetector来检测该帧图中是否有人脸。当然如果你想在surfaceview中绘制人脸的范围,可以将画布与其绑定,画完再解绑。
第一步
我们首先来定义一个surfaceview盖在我们Carmen使用的surfaceview上进行对人脸范围的绘制
publicclassFindFaceViewextendsSurfaceViewimplementsSurfaceHolder.Callback{
privateSurfaceHolderholder;
privateintmWidth;
privateintmHeight;
privatefloateyesDistance;
publicFindFaceView(Contextcontext,AttributeSetattrs){
super(context,attrs);
holder=getHolder();
holder.addCallback(this);
holder.setFormat(PixelFormat.TRANSPARENT);
this.setZOrderOnTop(true);
}
@Override
publicvoidsurfaceChanged(SurfaceHolderholder,intformat,intwidth,
intheight){
mWidth=width;
mHeight=height;
}
@Override
publicvoidsurfaceCreated(SurfaceHolderholder){
}
@Override
publicvoidsurfaceDestroyed(SurfaceHolderholder){
}
publicvoiddrawRect(FaceDetector.Face[]faces,intnumberOfFaceDetected){
Canvascanvas=holder.lockCanvas();
if(canvas!=null){
PaintclipPaint=newPaint();
clipPaint.setAntiAlias(true);
clipPaint.setStyle(Paint.Style.STROKE);
clipPaint
.setXfermode(newPorterDuffXfermode(PorterDuff.Mode.CLEAR));
canvas.drawPaint(clipPaint);
canvas.drawColor(getResources().getColor(color.transparent));
Paintpaint=newPaint();
paint.setAntiAlias(true);
paint.setColor(Color.GREEN);
paint.setStyle(Style.STROKE);
paint.setStrokeWidth(5.0f);
for(inti=0;i
重要的地方
1.holder=getHolder();获取surfaceholder与我们要绘制人脸范围的画布进行绑定Canvascanvas=holder.lockCanvas();这样我们就可以愉快的进行绘制了,当然前提是我们要拿到人脸的坐标位置。
2.还有重要的一点,就是要让我们用来盖在Carema上的Surfaceview可以同名,并且设置起在视图树的层级为最高。
holder.setFormat(PixelFormat.TRANSPARENT);
this.setZOrderOnTop(true);
第二步
就是我们对人脸进行检测了,当然前提是我们要获得帧图
publicclassFaceRecognitionDemoActivityextendsActivityimplements
OnClickListener{
privateSurfaceViewpreview;
privateCameracamera;
privateCamera.Parametersparameters;
privateintorientionOfCamera;//前置摄像头的安装角度
privateintfaceNumber;//识别的人脸数
privateFaceDetector.Face[]faces;
privateFindFaceViewmFindFaceView;
privateImageViewiv_photo;
privateButtonbt_camera;
TextViewmTV;
/**
*Calledwhentheactivityisfirstcreated.
*/
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
@Override
protectedvoidonStart(){
super.onStart();
iv_photo=(ImageView)findViewById(R.id.iv_photo);
bt_camera=(Button)findViewById(R.id.bt_camera);
mTV=(TextView)findViewById(R.id.show_count);
bt_camera.setOnClickListener(this);
mFindFaceView=(FindFaceView)findViewById(R.id.my_preview);
preview=(SurfaceView)findViewById(R.id.preview);
//设置缓冲类型(必不可少)
preview.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
//设置surface的分辨率
preview.getHolder().setFixedSize(176,144);
//设置屏幕常亮(必不可少)
preview.getHolder().setKeepScreenOn(true);
preview.getHolder().addCallback(newSurfaceCallback());
}
privatefinalclassMyPictureCallbackimplementsPictureCallback{
@Override
publicvoidonPictureTaken(byte[]data,Cameracamera){
try{
Bitmapbitmap=BitmapFactory.decodeByteArray(data,0,
data.length);
Matrixmatrix=newMatrix();
matrix.setRotate(-90);
Bitmapbmp=Bitmap.createBitmap(bitmap,0,0,bitmap
.getWidth(),bitmap.getHeight(),matrix,true);
bitmap.recycle();
iv_photo.setImageBitmap(bmp);
camera.startPreview();
}catch(Exceptione){
e.printStackTrace();
}
}
}
privatefinalclassSurfaceCallbackimplementsCallback{
@Override
publicvoidsurfaceChanged(SurfaceHolderholder,intformat,intwidth,
intheight){
if(camera!=null){
parameters=camera.getParameters();
parameters.setPictureFormat(PixelFormat.JPEG);
//设置预览区域的大小
parameters.setPreviewSize(width,height);
//设置每秒钟预览帧数
parameters.setPreviewFrameRate(20);
//设置预览图片的大小
parameters.setPictureSize(width,height);
parameters.setJpegQuality(80);
}
}
@Override
publicvoidsurfaceCreated(SurfaceHolderholder){
intcameraCount=0;
Camera.CameraInfocameraInfo=newCamera.CameraInfo();
cameraCount=Camera.getNumberOfCameras();
//设置相机的参数
for(inti=0;i
到这里我们的人脸识别就已经大功告成。demo地址
如果您想了解更多关于人脸识别方面的只是,先去关注并了解OpenCV。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。