我正在编写一个使用相机预览来检测脸部的应用。我的设备可以检测面部,设置监听器并启动面部检测(按此顺序),但永远不会调用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。
答案 0 :(得分:2)
这是我自己的愚蠢错误的经典案例。我有一个自定义方法在我的自定义CameraView类中设置面部检测侦听器,但我没有在该自定义方法中设置实际的侦听器。所以请留意你的定制恶作剧,伙计们。 :p