Захват кадра камеры в android после обнаружения лица

Я работаю с распознаванием лиц в 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 в указанном выше методе, но мне не удалось сохранить кадр, используя этот подход. Пожалуйста, подскажите способ, которым я могу сохранить кадр камеры.


person Bhoot    schedule 29.01.2014    source источник


Ответы (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. Надеюсь, кому-то это пригодится.

person Bhoot    schedule 28.04.2015
comment
Привет! мне это нужно в моем приложении. Можете ли вы предоставить мне надлежащую последовательность действий или код, в котором я могу найти запись видео с распознаванием лиц. - person Reshma; 16.12.2015
comment
@Reshma: Я бы посоветовал вам взглянуть на SDK Qualcomm Snapdragon для Android - разработчик . qualcomm.com/software/snapdragon-sdk-android. - person Bhoot; 16.12.2015