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。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。