Android(Glass)无法在onFaceDetection中检测到Faces

时间:2014-05-19 01:30:50

标签: android android-camera google-glass face-detection

我有一个小应用程序只是为了测试相机预览和面部识别。预览表面显示,我可以看到调用onFaceDetection回调。如果我在onFaceDetection中放入一个Log调用,我会看到它被重复调用,但是有一个空的Faces []数组。

注意:" Log"下面的调用不是被调用的调用,下面示例中的日志调用是从不调用。但是我可以在for语句之外添加另一个Log调用,并且将调用它。

这是我的代码:

package com.example.glassgoggles;

import android.content.Context;
import android.hardware.Camera;
import android.hardware.Camera.Face;
import android.hardware.Camera.FaceDetectionListener;
import android.hardware.Camera.Parameters;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class CameraPreviewView extends SurfaceView implements SurfaceHolder.Callback, FaceDetectionListener {

    private SurfaceHolder surfaceHolder = null;
    private Camera camera = null;

    @SuppressWarnings("deprecation")
    public CameraPreviewView(Context context) {
        super(context);

        surfaceHolder = this.getHolder();
        surfaceHolder.addCallback(this);
        surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {

        camera = Camera.open();
        this.setCameraParameters();
        try 
        {
            camera.setPreviewDisplay(holder);
        } 
        catch (Exception e) 
        {
            this.releaseCamera();
        }

    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width,
            int height) {
        if (camera != null)
        {
            camera.setFaceDetectionListener(this);
            camera.startPreview();
            this.startFaceDetectionIfSupported();
        }

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        this.releaseCamera();       
    }

    public void releaseCamera() 
    {
        if (camera != null) 
        {
            camera.release();
            camera = null;
        }
    }

    public void setCameraParameters()
    {
        if (camera != null)
        {
            Parameters parameters = camera.getParameters();
            parameters.setPreviewFpsRange(30000, 30000);
            camera.setParameters(parameters);   
        }
    }

    public void startFaceDetectionIfSupported() {
        if (camera != null) {
            Parameters parameters = camera.getParameters();
            if (parameters.getMaxNumDetectedFaces() > 0) {
                Log.d("Face Detection", "Starting...");
                camera.startFaceDetection();
            } else {
                Log.d("Face Detection", "No faces allowed...");
            }
        }
    }

    @Override
    public void onFaceDetection(Face[] faces, Camera camera) {
        for(int i = 0; i < faces.length; i++) {
            Log.d("Face Check", "Found a face...");
        }
    }

}

1 个答案:

答案 0 :(得分:1)

人脸检测不是面部识别。这只是一种识别相机预览中是否有面孔的方法,它可以用于一种功能,例如当手机相机预览在脸部周围绘制一个框并且可能聚焦在脸部时。但Glass有固定焦距相机,因此人脸检测并不适用。除此之外...

Google Glass玻璃政策政策明确禁止面部识别。

第C.1.e节说:

  

请勿使用相机或麦克风进行交叉引用,并立即显示识别用户以外的任何人的个人信息,包括面部识别和声纹等用例。执行此操作的玻璃器皿目前尚未获得批准。

参考:

https://developers.google.com/glass/policies

我希望为您的问题增加一些清晰度。如果您使用“面部识别”是一个错字,并且您打算说“面部检测”,您应该编辑您的问题。