0

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

4

3 回答 3

9

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

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

这两种格式都是 YUV 4:2:0 格式;颜色信息在两个维度上都进行了 2 倍的二次采样,并且图像数据的布局与标准的交错 RGB 格式有很大的不同。FourCC.org 的 NV21 描述作为一个来源,具有您想要的布局信息 - 首先是 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) 较小的情况下。

于 2012-12-05T04:08:06.547 回答
1

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

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

尝试这个:

Camera.Parameters.setPreviewFormat(ImageFormat.RGB_565);

于 2012-12-05T05:49:44.927 回答
0

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

于 2012-12-05T01:19:51.587 回答