android自定义facedetector捕获帧仅在检测到face时

时间:2018-02-24 10:50:25

标签: java android vision google-vision

我正在使用新的视觉api来检测相机流中的脸部。如果检测到新面部,我将通过自定义FaceDetector类捕获图像(如此主题中所述:Mobile Vision API - concatenate new detector object to continue frame processing

class MyFaceDetector extends Detector<Face> {
    private Detector<Face> mDelegate;

    MyFaceDetector(Detector<Face> delegate) {
        mDelegate = delegate;
    }

    public SparseArray<Face> detect(Frame frame) {
        int width = frame.getMetadata().getWidth();
        int height = frame.getMetadata().getHeight();

        YuvImage yuvImage = new YuvImage(frame.getGrayscaleImageData().array(), ImageFormat.NV21, width, height, null);
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        yuvImage.compressToJpeg(new Rect(0, 0, width, height), 100, byteArrayOutputStream);
        byte[] jpegArray = byteArrayOutputStream.toByteArray();
        Bitmap bitmap = BitmapFactory.decodeByteArray(jpegArray, 0, jpegArray.length);
        GraphicHolder.faceImage = bitmap;

        return mDelegate.detect(frame);
    }

    public boolean isOperational() {
        return mDelegate.isOperational();
    }

    public boolean setFocus(int id) {
        return mDelegate.setFocus(id);
    }
}

我遇到的问题是每次调用detect函数时都会创建一个位图。这不仅是在识别新面孔时。 在我的情况下,这是不需要的,并将使用我想避免的不必要的资源。

有没有办法改变它,所以它只在检测到面部时才创建一个位图?

1 个答案:

答案 0 :(得分:0)

我将使用相同的方法,但不确定使用的代码是否正确:

FaceDetector faceDetector = new FaceDetector.Builder(context)
        .build();
MyFaceDetector myFaceDetector = new MyFaceDetector(faceDetector);

myFaceDetector.setProcessor(/* include your processor here */);

mCameraSource = new CameraSource.Builder(context, myFaceDetector)
        .build();

您在里面写了什么:/ *在这里包括您的处理器* /? 在此先感谢