1

Я пишу простое приложение для Android, где я извлекаю фрейм-буферы с помощью ImageReader.OnImageAvailableListener, чтобы получить последнее изображение и обработать Y-плоскость. Я использую эту плоскость, чтобы вычислить простую метрику, значение которой решит, отображать ли я что-либо на экране или нет.Android Camera2 YUV_420_888 Y Channel Interpretation

Вопрос был в том, как обрабатывать и интерпретировать только плоскость Y (мне не нужны U и V-плоскости). По моему мнению, плоскость Y содержит канал яркости; то есть. канал с яркостью изображения.

Документация заявляет, что каждый пиксель составляет 8 бит, то есть один байт, который, как я полагаю, имеет смысл, поскольку пиксели находятся в ByteBuffer. Однако после некоторых экспериментов печать первого байта Y-канала (я делаю это, вызывая Log.i(TAG, String.valueOf(image.getPlanes()[0].getBuffer().get(0) в моем ImageReader.OnImageAvailableListener), я не вижу никакой корреляции между «яркостью» изображения и значением байта. Например, когда я помещаю камеру на полностью черный фон, я получаю значения от ~ 0 до 15 для яркости. Когда я помещаю его на яркий белый фон, я получаю значения около -110. Однако это не какие-то минимумы или максимумы; Я получаю значения, которые, похоже, не коррелируют с яркостью вообще, если на небелоном или полностью черном фоне.

Вопрос в том, как эти значения яркости должны интерпретироваться и они каким-либо образом коррелируют с яркостью изображения на определенном пикселе? Правильно ли я извлекаю значения яркости для буфера кадров, а если нет, как их можно получить?

+0

Родственные: http://stackoverflow.com/questions/22793155/difference-between-yuv420-and-yuv422 –

ответ

0

Я, наконец, понял это после многократного сжимания рук: я наткнулся на ключ ответа на ссылку this. Значения, которые сообщаются, на самом деле являются значениями яркости, но ByteBuffer, в котором они размещены, SIGNED, в то время как значения яркости UNSIGNED (как указано в ссылке). Таким образом, каждое значение из буфера должно быть & -ed с 0xff, чтобы получить истинное значение яркости, которое на этот раз имеет смысл.