【问题标题】:YUV image processingYUV图像处理
【发布时间】:2012-11-22 17:56:31
【问题描述】:

我正在开发一个 android 应用程序,对于从相机传递的每个 YUV 图像,它会从中随机选择 10 个像素并检查它们是红色还是蓝色。 我知道如何对 RGB 图像执行此操作,但不适用于 YUV 格式。 由于运行时间限制,我无法将其逐像素转换为 RGB 图像。

【问题讨论】:

标签: java android image


【解决方案1】:

我假设您正在使用 Camera API 的预览回调,您可以在其中为每一帧获取一个 byte[] 数据数组。

首先,您需要选择要使用的 YUV 格式。需要支持NV21,Android 3.0以后需要YV12。其他格式均不保证可用。所以NV21是最安全的选择,也是默认的。

这两种格式都是 YUV 4:2:0 格式;颜色信息在两个维度上都进行了 2 倍的二次采样,并且图像数据的布局与标准的交错 RGB 格式有很大不同。 FourCC.org's NV21 description,作为一个来源,有你想要的布局信息——首先是 Y 平面,然后是交错的 UV 数据。但由于这两个颜色平面只有 Y 平面大小的 1/4,因此您必须决定如何对它们进行上采样 - 最简单的是最近邻。所以如果你想从大小为(w,h)的图像中获取像素(x,y),最近邻方法是:


Y = image[ y * w + x];
U = image[ w * h + floor(y/2) * (w/2) + floor(x/2) + 1]
V = image[ w * h + floor(y/2) * (w/2) + floor(x/2) + 0]

也可以对色度通道使用更复杂的上采样(双线性、三次等),但适合的方式取决于应用程序。

获得 YUV 像素后,您需要对其进行解释。如果您更习惯在 RGB 中操作,可以使用Wikipedia 处的这些 JPEG 转换公式来获取 RGB 值。

或者,您可以只使用 V (Cr) 的较大正值来表示红色,尤其是在 U (Cb) 较小的情况下。

【讨论】:

  • 你拯救了我的一天。
  • @Ghazi 你是如何将字节数组 (yuv) 转换为 nv21 的?
  • @mger NV21其实是一种YUV图像格式的编码格式。两者都驻留在 ByteArray 中。简单来说,你的 YUV 数组是兼容 NV21 的,如果你是从安卓的摄像头获取的。
【解决方案2】:

来自 Reuben Scratton 的回答 Converting YUV->RGB(Image processing)->YUV during onPreviewFrame in android?

您可以让相机预览使用 RGB 格式而不是 YUV。

试试这个:

Camera.Parameters.setPreviewFormat(ImageFormat.RGB_565);

【讨论】:

【解决方案3】:

YUV 只是另一种色彩空间。您可以在 YUV 空间中定义红色,就像在 RGB 空间中一样。一个简单的calculator 建议 RGB 值 255,0,0(红色)在 YUV 空间中应该显示为 76,84,255,所以只需寻找接近的值。

【讨论】:

  • @LonelyCoder - 有一段时间,一个跟踪者对我所有的帖子都投了反对票 - 这可能就是原因。
猜你喜欢
  • 2017-04-23
  • 2012-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-19
  • 1970-01-01
相关资源
最近更新 更多