Получение меньших данных из предварительного просмотра камеры в Android - PullRequest
3 голосов
/ 04 декабря 2011

Привет, я разрабатываю приложение для обработки изображений в реальном времени на Android.Я использую PreviewCallback, чтобы получить изображение в каждом кадре.Когда я получаю данные в планшетных устройствах, данные возвращаются очень большими.Поэтому слишком сложно работать с большими данными в режиме реального времени.У меня вопрос, есть ли способ получить данные с меньшим разрешением из предварительного просмотра камеры.

КОД ПРОСМОТРА КАМЕРЫ:

public void onPreviewFrame(byte[] data, Camera camera) {
                        // TODO Auto-generated method stub
                        Camera.Parameters params = camera.getParameters();

                        Log.v("image format", Integer.toString(params.getPreviewFormat()));
                        //Frame captureing via frameManager
                        frameManager.initCamFrame(params.getPreviewSize().width, params.getPreviewSize().height,
                                data);
                    }
                });

Ответы [ 3 ]

0 голосов
/ 04 декабря 2011

Вы можете вызвать параметры. setPreviewSize (ширина, высота), но вы хотите сделать это до запуска предварительного просмотра камеры.И вам нужно использовать поддерживаемое значение, а именно предыдущий ответ.

И вам также не следует вызывать camera.getParameters () каждый кадр, просто сделайте это один раз и сохраните значения в некоторой переменной.У вас есть ограниченное время в onPreviewFrame, потому что данные byte [] перезаписываются в каждом кадре, поэтому попробуйте сделать только важные вещи здесь.

И вы должны использовать setPreviewCallbackWithBuffer , это значительно улучшает производительность - проверьте этот пост .

0 голосов
/ 15 октября 2015

Вы можете попробовать это:

 @Override
        public void onPreviewFrame(byte[] data, Camera camera) {
        try {
            byte[] baos = convertYuvToJpeg(data, camera);
            StringBuilder dataBuilder = new StringBuilder();
            dataBuilder.append("data:image/jpeg;base64,").append(Base64.encodeToString(baos, Base64.DEFAULT));
            mSocket.emit("newFrame", dataBuilder.toString());
        } catch (Exception e) {
           Log.d("########", "ERROR");
        }
    }

};


public byte[] convertYuvToJpeg(byte[] data, Camera camera) {

    YuvImage image = new YuvImage(data, ImageFormat.NV21,
            camera.getParameters().getPreviewSize().width, camera.getParameters().getPreviewSize().height, null);

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    int quality = 20; //set quality
    image.compressToJpeg(new Rect(0, 0, camera.getParameters().getPreviewSize().width, camera.getParameters().getPreviewSize().height), quality, baos);//this line decreases the image quality


    return baos.toByteArray();
}
0 голосов
/ 04 декабря 2011

Знаете ли вы, что вы можете получить список поддерживаемых размеров предварительного просмотра из параметров камеры, позвонив по номеру getSupportedPreviewSizes()? Все устройства, которые я пробовал, возвращали отсортированный список, хотя иногда в порядке возрастания, а иногда в порядке убывания. Возможно, вы захотите вручную выполнить итерацию списка, чтобы найти «наименьший» размер предварительного просмотра, или сначала отсортировать его и получить первый элемент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...