YUV图像处理



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

我假设您使用的是Camera API的预览回调,在这里您可以获得每个帧的byte[]数据数组。

首先,您需要选择要使用的YUV格式。要求支持NV21,并且从Android 3.0开始需要YV12。其他格式都不能保证可用。所以NV21是最安全的选择,也是默认的。

这两种格式都是YUV 4:2:0格式;颜色信息在两个维度上都被2x二次采样,并且图像数据的布局与标准交错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操作更满意,你可以在维基百科上使用这些JPEG转换方程来获得RGB值。

或者,您可以只使用V(Cr)的大正值来表示红色,特别是当U(Cb)很小时。

来自Reuben Scratton在转换YUV->RGB(图像处理)->YUV在安卓系统中的onPreviewFrame?

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

试试这个:

Camera.Parameters.setPreviewFormat(ImageFormat.RGB_565);

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

最新更新