Android Camera2 YUV_420_888 Y 通道解释

Android Camera2 YUV_420_888 Y Channel Interpretation

我正在编写一个简单的 Android 应用程序,我在其中使用 ImageReader.OnImageAvailableListener 检索帧缓冲区以获取最新图像并处理 Y 平面。我使用这个平面来计算一个简单的指标,其值将决定我是否在屏幕上显示某些内容。

我的问题是如何只处理和解释 Y 平面(我不需要 U 和 V 平面)。据我了解,Y 平面包含亮度通道; IE。具有图像亮度的通道。

文档指出每个像素为 8 位,即一个字节,我认为这是有道理的,因为像素位于 ByteBuffer 中。然而,在打印 Y 通道的第一个字节的一些实验之后(我通过在我的 ImageReader.OnImageAvailableListener 中调用 Log.i(TAG, String.valueOf(image.getPlanes()[0].getBuffer().get(0) 来做到这一点),我没有看到图像 "brightness" 和值之间有任何相关性的字节。例如,当我将相机放在完全黑色的背景上时,我得到的亮度值介于 ~0 到 15 之间。当我把它放在明亮的白色背景上时,我得到的值约为 -110。但是,这些不是某种最小值或最大值。当在非全白或全黑背景上时,我会得到似乎与亮度完全不相关的值。

我的问题是,应该如何解释这些亮度值,它们是否以任何方式与特定像素处的图像亮度相关?我是否正确地检索了帧缓冲区的亮度值,如果不是,应该如何检索它们?

经过大量 hand-wringing 我终于弄明白了:我在 this link 上偶然发现了答案的关键。报告的值实际上是亮度值,但是放置它们的 ByteBuffer 是有符号的,而亮度值是无符号的(如 link 中所报告)。因此,缓冲区中的每个值都应该用 0xff 进行 & 编辑,以检索真正的亮度值,这一次是有意义的。