App层face detection init分析


人脸识别是android 4.0提供的新属性,具体表现是启动camera后就可以识别人脸的位置并且在识别到人脸后进行人脸对焦。首先分析人脸识别功能的启动过程。

Camera.java

onCreate(); 

      // don't setmSurfaceHolder here. We have it set ONLY within

       //surfaceChanged / surfaceDestroyed, other parts of the code

       // assumethat when it is set, the surface is also set.

       SurfaceViewpreview = (SurfaceView) findViewById(R.id.camera_preview);

       SurfaceHolder holder = preview.getHolder();

       holder.addCallback(this);

设置preview回调接口, 当preview创建成功后调用SurfaceHolder.Callback中的surfaceChanged方法。

      public voidsurfaceChanged(SurfaceHolder holder, int format, int w, int h)

       

       // Setpreview display if the surface is being created. Preview was

       // alreadystarted. Also restart the preview if display rotation has

       // changed.Sometimes this happens when the device is held in portrait

       // andcamera app is opened. Rotation animation takes some time and

       // displayrotation in onCreate may not be what we want.

       if(mCameraState == PREVIEW_STOPPED) {

           startPreview();

           startFaceDetection();

       } else {

           if(Util.getDisplayRotation(this) != mDisplayRotation) {

               setDisplayOrientation();

           }

           if (holder.isCreating()){

               //Set preview display if the surface is being created and preview

               //was already started. That means preview display was set to null

               //and we need to set it now.

               setPreviewDisplay(holder);

           }

       }

然后调用startFaceDetection()

       @Override

    public voidstartFaceDetection() {

       if(mFaceDetectionStarted || mCameraState != IDLE) return;

       if(mParameters.getMaxNumDetectedFaces() > 0) {

           mFaceDetectionStarted = true;

           mFaceView = (FaceView) findViewById(R.id.face_view);

           mFaceView.clear();

           mFaceView.setVisibility(View.VISIBLE);

           mFaceView.setDisplayOrientation(mDisplayOrientation);

            CameraInfo info =CameraHolder.instance().getCameraInfo()[mCameraId];

           mFaceView.setMirror(info.facing == CameraInfo.CAMERA_FACING_FRONT);

           mFaceView.resume();

           mCameraDevice.setFaceDetectionListener(this);

            mCameraDevice.startFaceDetection();

       }

    }

 

在startFaceDetection()中设定人脸识别监听,并且调用frameworks方法启动人脸识别。

------〉设定人脸识别监听

   mCameraDevice.setFaceDetectionListener(this);

    @Override

    public voidonFaceDetection(Face[] faces, android.hardware.Camera camera) {

       mFaceView.setFaces(faces);

    }

------〉调用frameworks方法启动人脸识别

   mCameraDevice.startFaceDetection();

   

      public finalvoid startFaceDetection() {

       if(mFaceDetectionRunning) {

           thrownew RuntimeException("Face detection is already running");

       }

       _startFaceDetection(getCurrentFaceDetectionType());

       mFaceDetectionRunning = true;

    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值