/cameraface

Android Camera 内置人脸识别的Demo: 通过Android源生API支持的人脸识别,获取到脸部矩形坐标,左右眼坐标,嘴坐标通过View动态实摄像头实时装饰功能

Primary LanguageJava

CameraFace

Android Camera 内置人脸识别的Demo

通过Android源生API支持的人脸识别FaceDetection,获取到脸部矩形坐标,左右眼坐标,嘴坐标通过View动态实摄像头实时装饰功能

Image

主要方法

//人脸识别设置监听

mCamera.setFaceDetectionListener(mFaceDetectionListener);

//人脸识别监听启动

mCamera.startFaceDetection();

class FaceDetectionListener implements Camera.FaceDetectionListener{

    @Override
    public void onFaceDetection(Camera.Face[] faces, Camera camera) {
        Message m = mHandler.obtainMessage();
        m.what = MainActivity.AC_DRAW;
        if (null == faces || faces.length == 0) {
            m.obj = null;
            Log.d("face", "onFaceDetection : There is no face found.");
        } else {
            Log.d("face", "onFaceDetection : face found.");
            m.obj = faces;
            for (int i = 0; i < faces.length; i++) {
                Camera.Face face = faces[i];
                if (face == null)return;
                Rect rect = face.rect;
                Log.i("face","face.score="+face.score);
                Log.i("face","rect.left="+rect.left+"\nrect.top="+rect.top+"\nrect.right="+rect.right+"\nrect.bottom="+rect.bottom);
                Log.i("face","id="+face.id+" \nface.leftEye.x="+face.leftEye.x+" \nface.leftEye.y"+face.leftEye.y+" \nface.mouth.x="+face.mouth.x+" \nface.mouth.y="+face.mouth.y);
            }
        }
        m.sendToTarget();
    }
}


//faces 识别出的人脸特征数据
public static class Face {
	public int id;//对应id
	public Point leftEye;//左眼
	public Point mouth;//嘴
	public Rect rect;//脸部坐标
	public Point rightEye;//右眼
	public int score;//识别分数
}

//绘制对应的装饰图片
protected void onDraw(Canvas canvas) {
	if (mFaces == null || mFaces.length < 1) {
	    return;
	}
	boolean isMirror = false;
//        int Id =CameraInterface.getInstance().getCameraId();
//        if(Id == CameraInfo.CAMERA_FACING_BACK){
//            isMirror = false; //后置Camera无需mirror
//        }else if(Id == CameraInfo.CAMERA_FACING_FRONT){
	isMirror = true;  //前置Camera需要mirror
//        }
//        Util.prepareMatrix(mMatrix, isMirror, 90, mCameraW, mCameraH);
	Util.prepareMatrix(mMatrix, isMirror, 90, getWidth(), getHeight());
	canvas.save();
	mMatrix.postRotate(0); //Matrix.postRotate默认是顺时针
	canvas.rotate(-0);   //Canvas.rotate()默认是逆时针
	if (mFaces == null){
	    mFaceIndicatorDraw.draw(canvas);
	    mLeftEyeDraw.draw(canvas);
	    mRightEyeDraw.draw(canvas);
	    mMouthDraw.draw(canvas);
	}else {
	    for (int i = 0; i < mFaces.length; i++) {
	        Camera.Face face = mFaces[i];
	        mRect.set(face.rect);
	        mMatrix.mapRect(mRect);//计算出在父布局的真是坐标
	        //识别的Rect 系数,使装饰图片根据人脸与摄像头的距离放大或者缩小
	        float dx = mRect.bottom - mRect.top;
	        if (isHeadShow){
	            Log.i(TAG, "FaceView  dx=" +dx );
	            float h = dx * 0.4f;
	            mHeadDraw.setBounds(Math.round(mRect.left), Math.round(mRect.top - h),
	                    Math.round(mRect.right), Math.round(mRect.bottom - h));
	            mHeadDraw.draw(canvas);
	        }

	        if (isFaceIndicatorShow){
	            mFaceIndicatorDraw.setBounds(Math.round(mRect.left), Math.round(mRect.top),
	                    Math.round(mRect.right), Math.round(mRect.bottom));
	            mFaceIndicatorDraw.draw(canvas);
	        }

	        if (isLeftEyeShow){
	            float[] leftEye = {face.leftEye.x, face.leftEye.y};
	            mMatrix.mapPoints(leftEye);//计算出在父布局的真是坐标
	            float h = dx * 0.1f;
	            float w = dx * 0.15f;
	            mLeftEyeDraw.setBounds(Math.round(leftEye[0]-w), Math.round(leftEye[1]-h),
	                    Math.round(leftEye[0]+w), Math.round(leftEye[1]+h));
	            mLeftEyeDraw.draw(canvas);
	        }

	        if (isRightEyeShow){
	            float[] rightEye = {face.rightEye.x, face.rightEye.y};
	            float w = dx * 0.15f;
	            float h = dx * 0.1f;
	            mMatrix.mapPoints(rightEye);//计算出在父布局的真是坐标
	            mRightEyeDraw.setBounds(Math.round(rightEye[0]-w), Math.round(rightEye[1]-h),
	                    Math.round(rightEye[0]+w), Math.round(rightEye[1]+h));
	            mRightEyeDraw.draw(canvas);
	        }

	        if (isMouthShow){
	            float[] mouthP = {face.mouth.x, face.mouth.y};
	            mMatrix.mapPoints(mouthP);//计算出在父布局的真是坐标
	            float w = dx * 0.15f;
	            float h = dx * 0.2f;
	            mMouthDraw.setBounds(Math.round(mouthP[0]-w), Math.round(mouthP[1]-h),
	                    Math.round(mouthP[0]+w), Math.round(mouthP[1]));
	            mMouthDraw.draw(canvas);
	        }
	    }
	}
	canvas.restore();
	super.onDraw(canvas);
    }