【问题标题】:Android Camera2 YUV_420_888 Y Channel InterpretationAndroid Camera2 YUV_420_888 Y通道解读
【发布时间】:2017-06-25 04:04:59
【问题描述】:

我正在编写一个简单的 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) 来完成此操作),我看不到图像“亮度”和字节值之间有任何相关性。例如,当我将相机放在完全黑色的背景上时,我会得到从 ~0 到 15 的亮度值。当我把它放在明亮的白色背景上时,我得到的值在 -110 左右。但是,这些不是某种最小值或最大值。在非全白或全黑背景下,我会得到似乎与亮度完全不相关的值。

我的问题是,这些亮度值应该如何解释,它们是否与特定像素的图像亮度有任何关联?我是否正确检索帧缓冲区的亮度值,如果没有,应该如何检索它们?

【问题讨论】:

标签: android image-processing camera android-image android-camera2


【解决方案1】:

经过一番绞尽脑汁,我终于弄明白了:我在this 链接上偶然发现了答案的关键。报告的值实际上是亮度值,但它们所在的 ByteBuffer 是有符号的,而亮度值是无符号的(如链接中所报告的)。因此,缓冲区中的每个值都应该是&-ed 和0xff 以检索真正的亮度值,这一次是有意义的。

【讨论】:

猜你喜欢
  • 2016-07-12
  • 1970-01-01
  • 2015-08-11
  • 1970-01-01
  • 2017-07-30
  • 1970-01-01
  • 2015-06-21
  • 2019-11-16
  • 1970-01-01
相关资源
最近更新 更多