未调用FaceDetectionListener onFaceDetection

时间:2014-12-15 23:23:48

标签: android camera android-camera face-detection

我正在编写一个使用相机预览来检测脸部的应用。我的设备可以检测面部,设置监听器并启动面部检测(按此顺序),但永远不会调用onFaceDetection。我已将SurfaceView子类化为显示相机预览的视图。

听众在所有活动的变量声明之后布局:

FaceDetectionListener fdl = new FaceDetectionListener() {
    @Override
    public void onFaceDetection(Face[] faces, Camera camera) {
        Log.d("CameraViewApp", "Faces detected.");
    }
}

当用户告诉应用程序显示持有摄像机视图的视图时,在屏幕上显示视图之前,这样就完成了:

cameraview = new CameraView(context);
Log.d("CameraViewApp", "Setting face detection listener.");
cameraview.setFaceDetectionListener(fdl);
rlMain.addView(cvGame, 0); //Adds cameraview to main view, "behind" everything else.
...
cameraview.startCamera();
setContentView(rlMain);

这是CameraView类的startCamera()方法的代码:

public void startCamera() {
    this.getHolder().addCallback(shcb);
    this.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

    this.camera = Camera.open(0);
}

回调:

private SurfaceHolder.Callback shcb = new SurfaceHolder.Callback() {
    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        try {
            if (camera != null) camera.setPreviewDisplay(holder);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        if(camera != null) {
            Size sizePreview = getBestPreviewSize(width, height, camera.getParameters()); //Custom method to find best preview size.
            parameters.setPreviewSize(sizePreview.width, sizePreview.height);
            requestLayout();

            camera.setParameters(parameters);
            camera.startPreview();

            if (fdl != null && camera.getParameters().getMaxNumDetectedFaces() > 0) {
                Log.d("CameraViewApp", "Starting face detection.");
                camera.startFaceDetection();
            }
        }
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        camera.stopFaceDetection();
        camera.stopPreview();
    }
};

"设置面部检测监听器"出现在LogCat中,然后是"开始面部检测"出现在LogCa中,但是" Faces检测到"永远不会出现在LogCat中。我已经尝试将相机对准屏幕上的脸部照片,我已经尝试将相机对准自己的脸,我已经尝试切换到前置式相机,这样我就可以确保在视图中拥有自己的面孔,永远不会调用onFaceDetection。

1 个答案:

答案 0 :(得分:2)

这是我自己的愚蠢错误的经典案例。我有一个自定义方法在我的自定义CameraView类中设置面部检测侦听器,但我没有在该自定义方法中设置实际的侦听器。所以请留意你的定制恶作剧,伙计们。 :p