在面部检测后捕获android中的相机框架

时间:2014-01-29 10:55:17

标签: android face-detection

我在Android中使用面部检测,我希望实现以下目标:
1.在Android中使用面部检测监听器来检测相机框架上的面部。
2.如果在相机框架上检测到面部,则提取面部并将其保存到外部存储器。

在浏览现有问题后,我发现没有直接的方法将检测到的面转换为位图并将其存储在磁盘上。所以现在我想要捕获并保存检测到面部的整个相机框架,但我无法这样做。

目前的代码结构如下:

FaceDetectionListener faceDetectionListener = new FaceDetectionListener() {

    @Override
    public void onFaceDetection(Face[] faces, Camera camera) {

        if (faces.length == 0) {
        } else {
            displayMessage("Face detected!");   
            // CODE TO SAVE CURRENT FRAME AS IMAGE
            finish();
        }
    }
};

我试图通过在上面的方法中调用takePicture来实现这一点,但我无法使用该方法保存帧。请建议一种方法,我可以保存相机框架。

1 个答案:

答案 0 :(得分:1)

我无法找到在FaceDetectionListener内保存相机框架的直接方法。因此,对于我的应用程序,我改变了处理相机预览数据的方式。我使用了PreviewCallback类的Camera接口,并在接口的onPreviewFrame方法中实现了逻辑。实施大纲如下:

class SaveFaceFrames extends Activity implements Camera.PreviewCallback, Camera.FaceDetectionListener {

    boolean lock = false; 

    public void onPreviewFrame(byte[] data, Camera camera) {
        ...
        if(lock) {
            Camera.Parameters parameters = camera.getParameters();
            Camera.Size size = parameters.getPreviewSize();
            YuvImage image = new YuvImage(data, parameters.getPreviewFormat(), size.width, size.height, null);
            ByteArrayOutputStream outstr = new ByteArrayOutputStream();
            image.compressToJpeg(new Rect(0, 0, image.getWidth(), image.getHeight()), 100, outstr);
            Bitmap bmp = BitmapFactory.decodeByteArray(outstr.toByteArray(), 0, outstr.size());
            lock = false;
        }
    }

    public void onFaceDetection(Camera.Face[] faces, Camera camera) {
        ...
        if(!lock) {
            if(faces.length() != 0) lock = true;
        }
    }
}

这不是一个理想的解决方案,但它适用于我的情况。可以在这些场景中使用第三方库。我使用并运行良好的一个库是Qualcomm的Snapdragon SDK。我希望有人觉得这很有用。