Я пишу простое приложение для 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. Однако это не какие-то минимумы или максимумы; Я получаю значения, которые, похоже, не коррелируют с яркостью вообще, если на небелоном или полностью черном фоне.
Вопрос в том, как эти значения яркости должны интерпретироваться и они каким-либо образом коррелируют с яркостью изображения на определенном пикселе? Правильно ли я извлекаю значения яркости для буфера кадров, а если нет, как их можно получить?
Родственные: http://stackoverflow.com/questions/22793155/difference-between-yuv420-and-yuv422 –