我正在开发一款android应用程序,它会从摄像头传来的每一张YUV图像中随机选取10个像素,并检查它们是红色还是蓝色。我知道如何处理RGB图像,但不知道如何处理YUV格式的图像。由于运行时的限制,我无法逐个像素地将其转换为RGB图像。
发布于 2012-12-05 12:08:07
我假设您使用的是Camera API的预览回调函数,在该回调函数中,您将获得每个帧的byte[]数据数组。
首先,您需要选择要使用的YUV格式。需要支持NV21,从Android3.0开始需要支持YV12。其他任何格式都不能保证可用。所以NV21是最安全的选择,也是默认的。
这两种格式都是YUV4:2:0格式;颜色信息在两个维度上被2倍二次采样,并且图像数据的布局与标准的交错RGB格式有很大的不同。作为一个源,FourCC.org's NV21 description具有所需的布局信息-首先是Y平面,然后是交错的UV数据。但由于这两个颜色平面的大小只有Y平面的四分之一,你必须决定如何对它们进行上采样-最简单的是最近邻。因此,如果您想从大小为(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-05 13:49:45
从Reuben在Converting YUV->RGB(Image processing)->YUV during onPreviewFrame in android?中的回答
可以使相机预览使用RGB格式,而不是YUV格式。
试试这个:
Camera.Parameters.setPreviewFormat(ImageFormat.RGB_565);
发布于 2012-12-05 09:19:52
YUV只是另一种颜色空间。您可以在YUV空间中定义红色,就像在RGB空间中一样。一个简单的calculator建议RGB值255,0,0 (红色)应该在YUV空间中显示为类似76,84,255的值,所以只需查找接近该值的值即可。
https://stackoverflow.com/questions/13714232
复制相似问题