2017-01-20 3 views
3

Я пытаюсь использовать Google Mobile Vision API с модулем camera2, и у меня много проблем.camera2 output to Bitmap

Я использую код примера android-Camera2Video Google в качестве базы. Я изменил его, чтобы включить следующую функцию обратного вызова:

Camera2VideoFragment.java

OnCameraImageAvailable mCameraImageCallback; 

public interface OnCameraImageAvailable { 
    void onCameraImageAvailable(Image image); 
} 


ImageReader.OnImageAvailableListener mImageAvailable = new ImageReader.OnImageAvailableListener() { 
    @Override 
    public void onImageAvailable(ImageReader reader) { 

     Image image = reader.acquireLatestImage(); 
     if (image == null) 
      return; 

     mCameraImageCallback.onCameraImageAvailable(image); 

     image.close(); 
    } 
}; 

Таким образом, любой фрагмент, включающий Camera2VideoFragment.java может получить доступ к своим изображениям.

Теперь API-интерфейс Barcode принимает только изображения Bitmap, но я не могу преобразовать YUV_420_888 в Bitmap. Вместо этого я изменил Формат файла imageReader «s к JPEG и побежал следующий код преобразования:

Image.Plane[] planes = image.getPlanes(); 
    ByteBuffer buffer = planes[0].getBuffer(); 
    buffer.rewind(); 
    byte[] data = new byte[buffer.capacity()]; 
    buffer.get(data); 
    Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length); 

Это работало, но падение частоты кадров кормления JPEG данных в imageReader был значительным. Мне интересно, если кто-то работал над этой проблемой раньше.

ответ

1

Поздний ответ, но мы надеемся, все еще полезно.

Как Ezequiel Адриан на его Example объяснил превращение YUV_420_888 в один из поддерживаемых форматов (В случае NV21), вы можете сделать подобную вещь, чтобы получить выход Bitmap:

private byte[] convertYUV420888ToNV21(Image imgYUV420) { 
// Converting YUV_420_888 data to YUV_420_SP (NV21). 
byte[] data; 
ByteBuffer buffer0 = imgYUV420.getPlanes()[0].getBuffer(); 
ByteBuffer buffer2 = imgYUV420.getPlanes()[2].getBuffer(); 
int buffer0_size = buffer0.remaining(); 
int buffer2_size = buffer2.remaining(); 
data = new byte[buffer0_size + buffer2_size]; 
buffer0.get(data, 0, buffer0_size); 
buffer2.get(data, buffer0_size, buffer2_size); 
return data;} 

Затем вы можете преобразовать результат в Bitmap:

Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);