Можно ли получить один пиксель из CameraPreview? - PullRequest
0 голосов
/ 19 февраля 2019

Я следовал учебнику по Android Studio, чтобы заставить CameraPreview работать ( Camera API Android Developer Guide ).Это прекрасно работает для меня, и я могу просматривать поток камеры в моем FrameLayout.

Но я хотел бы получать значения RGB из определенного пикселя в Preview каждый раз, когда он изменяется.Я не нашел метод, который дает мне previewImage как растровое изображение и не смог понять, как использовать метод onPreviewFrame

@Override public void onPreviewFrame(byte[] data, Camera camera) {}

Как получить значения RGBс пикселя Camerapreview?

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

К любому API, к сожалению, вам нужно самостоятельно обрабатывать данные YUV.

Устройства камеры изначально генерируют данные YUV, а не RGB, поэтому API не тратит дополнительные ресурсы на автоматическое преобразование данных.Основное простое исключение - передача данных в графический процессор, где драйвер графического процессора автоматически преобразует YUV в RGB для вас в пиксельном шейдере.

Но если вы просто в обычном коде приложения, вам нужно проанализироватьdata.

Для устаревшего API android.hardware.Camera выходные данные по умолчанию равны NV21, и вы обычно можете выбрать YV12 в качестве другого варианта.

Статья Википедии о YUV относительно полезна:https://en.wikipedia.org/wiki/YUV

Но он имеет неправильные коэффициенты преобразования для преобразования YUV-> RGB;они должны быть:

R = Y + 1.402 (Cr-128)
G = Y - 0.34414 (Cb-128) - 0.71414 (Cr-128)
B = Y + 1.772 (Cb-128)

(Cb = U, Cr = V)

Вы также можете взглянуть на этот пост stackoverflow: Извлечь черно-белое изображение из формата NV21 камеры Android

, который имеет код, которыйвыглядит правильно для преобразования.

0 голосов
/ 20 февраля 2019

Если вы используете Camera2 API, вы можете реализовать класс ImageReader.OnImageAvailableListener в своем приложении.После этого вы переопределяете функцию onImageAvailable, которая получает ImageReader в качестве аргумента.Затем вы можете получить доступ к только что записанному изображению с помощью imageReader.acquireNextImage().

...