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

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


person ashishdhiman2007    schedule 18.01.2017    source источник


Ответы (2)


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

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

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

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

Как только вы получите кадры предварительного просмотра Camera2 из вашего ImageReader как Image, вы можете использовать эту функцию, чтобы преобразовать его в поддерживаемый формат (в данном случае 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;
}

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

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

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

mDetector.receiveFrame(outputFrame);

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

person Ezequiel Adrian    schedule 21.03.2017
comment
Эскиэль, но когда я следую вашему примеру с github и пытаюсь применить обнаружение штрих-кода pdf417, он не работает должным образом. Штрих-код pdf417 не очень хорошо обнаруживается (QR-код отлично работает, но не в формате pdf417, я думаю, это связано с проблемой потоковой передачи...) - person Jeffrey Liu; 27.03.2017
comment
Куда пропал самолет U? NV12 - это чередующийся UV, ваш код не может работать. - person Adrian Crețu; 21.03.2018
comment
Я использую этот код в производстве и работает отлично. github.com/bytedeco/javacv/issues/298 bugs.chromium.org/p/libyuv/issues/detail?id=604 - person Ezequiel Adrian; 21.03.2018

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

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

person ashishdhiman2007    schedule 18.01.2017