Можно ли использовать Camera2 с Google Vision API

Можно ли распознать лица, используя Camera2 только с Google Vision API? Я не мог найти способ интегрировать это.

2 ответа

Да, можно использовать Camera2 API с Google Vision API.

Для начала, Google Vision API Face Detector получает объект Frame, который используется для анализа (обнаружения лиц и его ориентиров).

Camera1 API предоставляет кадры предварительного просмотра в формате изображения NV21, который идеально подходит для нас. Google Vision Frame.Builder поддерживает как setImageData (ByteBuffer в формате изображения NV16, NV21 или YV12), так и setBitmap для использования растрового изображения в качестве предварительных кадров для обработки.

Ваша проблема в том, что Camera2 API предоставляет кадры предварительного просмотра в другом формате. Это YUV_420_888. Чтобы все работало, вы должны преобразовать кадры предварительного просмотра в один из поддерживаемых форматов.

После того как вы получите Camera2 Preview Frames из ImageReader в качестве изображения, вы можете использовать эту функцию, чтобы преобразовать ее в поддерживаемый формат (в данном случае NV21).

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;
}

Затем вы можете использовать возвращенный байт [] для создания фрейма Google Vision:

outputFrame = new Frame.Builder()
    .setImageData(nv21bytes, mPreviewSize.getWidth(), mPreviewSize.getHeight(), ImageFormat.NV21)
    .setId(mPendingFrameId)
    .setTimestampMillis(mPendingTimeMillis)
    .setRotation(mSensorOrientation)
    .build();

Наконец, вы вызываете детектор с созданным кадром:

mDetector.receiveFrame(outputFrame);

В любом случае, если вы хотите узнать больше об этом, вы можете бесплатно протестировать мой рабочий пример на GitHub: Camera2Vision. Я надеюсь, что я помог:)

Хорошо, я нашел эту камеру2 с мобильным зрением? # 65

В официальном API нет ближайших планов для версии cameraSource класса camera2. Однако, учитывая структуру API, сообщество разработчиков может использовать альтернативную версию CameraSource, которая использует camera2. Все существующие API для работы с кадрами и детекторами достаточны для поддержки реализации camera2.

Другие вопросы по тегам