Новый кадр детектора Mobile Vision API получает растровое изображение

Я знаю, что подобный вопрос задавался раньше: - Mobile Vision API - объедините новый объект детектора для продолжения обработки кадров

Я получаю фрейм, но когда я вызываю frame.getBitmap (), он возвращает нулевой объект. Я хочу использовать это растровое изображение в https://github.com/tzutalin/dlib-android-app (Android dlib Library) Функция FaceDet.


person Honney Goyal    schedule 27.04.2017    source источник
comment
У вас есть какие-нибудь решения?   -  person BatyaGG    schedule 18.07.2017


Ответы (1)


Согласно документации Mobile Vision API, объект Frame имеет метод getBitmap(), но четко указано, что

getBitmap ()
Возвращает растровое изображение, которое было указано при создании этого кадра, или null, если для создания этого кадра не использовалось растровое изображение.

Если вы действительно хотите получить объект Bitmap, вам придется создать его самостоятельно. Один из вариантов - метод getGrayscaleImageData() для объекта Frame.
Если в возвращенном ByteBuffer есть несколько байтов, вы можете преобразовать его в Bitmap.

Сначала вы должны создать YuvImage, используя массив байтов из вашего getGrayscaleImageData() результата. Это обязательный шаг, потому что в массиве байтов есть изображение в YUV / YCbCr цветовое пространство, закодированное в NV21. Итак, первая строка будет выглядеть так:

YuvImage yuvImage = new YuvImage(frame.getGrayscaleImageData().array(), ImageFormat.NV21, width, height, null);

width и height можно извлечь из кадра методами getMedatada().getHeight() / getMedatada().getWidth().

Затем вы можете использовать ByteArrayOutputStream, чтобы быстро сжать ваш YuvImage объект.

ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
yuvImage.compressToJpeg(new Rect(0, 0, width, height), 100, byteArrayOutputStream);

Оттуда вы можете снова преобразовать его в массив байтов, чтобы наконец использовать его в BitmapFactory.

byte[] jpegArray = byteArrayOutputStream.toByteArray();
Bitmap bitmap = BitmapFactory.decodeByteArray(jpegArray, 0, jpegArray.length);

Я знаю, что это много кода по сравнению с использованием простого getBitmap() метода, но он выполнит свою работу, если вам действительно нужно растровое изображение в такой ситуации.

person palucdev    schedule 23.10.2017