根据http://developer.android.com/reference/android/graphics/ImageFormat.html#NV21,NV21是默认使用的格式.
网上有很多关于YUV NV21到RGB转换的代码.但是,当我查看代码时,我怀疑代码的正确性.
第一个组分V应首先出现,然后是第一个组分U.
根据http://wiki.videolan.org/YUV#NV21,NV21 is like NV12, but with U and V order reversed: it starts with V.
但是,当我完成代码实现时
[R应该是最显著位置
的根据实施int argb
在Color.java,R假设是在最显著位置.但是,我经历了以下代码实现
我想知道,他们是否犯了常见错误,或者我忽略了什么?
目前,我的实施如下.
public static void YUV_NV21_TO_RGB(int[] argb, byte[] yuv, int width, int height) {
final int frameSize = width * height;
final int ii = 0;
final int ij = 0;
final int …
Run Code Online (Sandbox Code Playgroud) 我完全理解所讨论的NV12格式的大小
现在我正在阅读有关以这种格式存储UV平面的两个来源:一个是https://msdn.microsoft.com/en-us/library/windows/desktop/dd206750(v=vs.85).aspx
NV12
所有Y样本首先在内存中显示为具有偶数行的无符号字符值数组.Y平面后面紧跟着一组无符号字符值,其中包含打包的U(Cb)和V(Cr)样本.当组合的UV数组作为little-endian WORD值的数组寻址时,LSB包含U值,并且MSB包含V值.NV12是DirectX VA的首选4:2:0像素格式.预计这将是支持4:2:0视频的DirectX VA加速器的中期要求.下图显示了Y平面和包含U和V样本的数组.
我的理解是:在UV平面中,每个U和V都以单字节存储.
当我从维基百科阅读这篇文章时:https: //wiki.videolan.org/YUV#NV12
它说:
NV12
与I420相关,NV12具有一个亮度"亮度"平面Y和一个具有U和V值交错的平面.在NV12中,色度平面(蓝色和红色)在水平和垂直维度上进行二次采样,系数为2.对于2x2像素组,您有4个Y样本和1个U和1个样本.将NV12视为I420与U和V平面交错是有帮助的.这是NV12的图形表示.每个字母代表一位:对于1 NV12像素:YYYYYYYY UVUV对于2像素NV12帧:YYYYYYYYYYYYYYY UVUVUVUV对于50像素NV12帧:Y*8*50(UV)*2*50对于n像素NV12帧:Y*8*n(UV)*2*n
我在这里理解的是:每个U和V在每个字节中逐位交错.因此,UV平面的每个字节将包含4U位和4V位交错.
任何人都可以澄清我的怀疑吗?
您好,我有一张如上图所示的图片.我可以检测十字的中心点并使用Matlab输出结果吗?谢谢.
NV12格式定义了具有 420 次采样的 YUV 颜色空间的特定颜色通道排序。
NV12格式主要用于视频编码/解码管道。
NV12 是一种双平面格式,具有全尺寸 Y 平面,后跟具有编织 U 和 V 值的单个色度平面。NV21 相同,但具有编织的 V 和 U 值。NV12中的12指的是每像素12位。NV12 具有半宽和半高色度通道,因此是 420 子采样。
在 NV12 上下文中,YUV 格式主要指YCbCr颜色空间。NV12 元素每个元素(类型)
有 8 位。
在帖子的上下文中,YUV 元素处于“有限范围”标准:Y 范围为 [16, 235],U,V 范围为 [16, 240]。 uint8
sRGB(标准红绿蓝)是 PC 系统使用的标准色彩空间。
在本文中,sRGB颜色分量范围为 [0, 255](uint8
类型)。
RGB 元素排序与帖子无关(假设有 3 个颜色平面)。
目前至少有 2 种可能的 YCbCr 格式应用 NV12:
NV12 元件订购示例:
YYYYYY
YYYYYY …
我在 Android 中使用 NV21 图像已经有一段时间了,我一直在跟踪一个错误,该错误可能是由 NV21 图像中的不正确索引字节引起的。
这个问题的答案中的图像很好地概述了 Y、U 和 V 字节在图像缓冲区中的位置。不确定是否允许,但我将其嵌入如下:
我对NV12格式有点困惑.我正在查看此页面以了解格式.我目前理解的是,如果你有一个640 x 480
diminsion 的图像或视频,那么Y平面将具有 640 x 480
字节,U和V都具有640/2 x 480/2
.这并不意味着U平面640/2 x 480/2
和V平面640/2 x 480/2
都只有640/2 x 480/2
字节.所以out缓冲区数组中的总字节数将是.2乘以(640/2) * (480/2)
因为uv平面将占用两个字节.
byte [] myArray new byte[(640 * 480) + (2 * (640/2) * (480/2)) ];
Run Code Online (Sandbox Code Playgroud)
所以问题是我以正确的方式理解它?我是以指定NV12格式的格式制作字节数组的.