将 YUY2 转换为 YV12
Convert YUY2 to YV12
我几乎可以肯定这比我想象的要简单得多,但是我已经在互联网上搜索了比我愿意承认的时间更长,试图弄清楚frig如何转换这两种格式。 我能够从无符号字节流(无符号字符(中提取 Y0、Cb、Y1、Cr 数据,但我不知道这些字节在 YV12 中是如何排列的 - 这个文档是否暗示各种值实际上包含在不同的行中?
我真的整天都在搜索"c++ 将 YUY2 转换为 YV12"之类的东西,并且完全没有找到任何教程或代码示例。 我认为这将有某种形式的文档可供我使用,但关于这个特定主题的信息似乎很少。
看起来 YUY2 上的链接条目以及 YV12 上的维基百科文章非常清楚地表明了这一点:
-
YUY2 将每两个相邻的水平像素存储为四个字节,
[Y1, U, Y2, V]
. -
YV12将整个M × N帧存储在一个连续的
M*N + 2 * (M/2 * N/2)
字节数组中。我们将数组称为byte frame[M * N * 3 / 2]
。我们有:-
[0, M * N)
中i
的frame[i]
是像素的 Y 值。 -
[M * N, M * N * 5/4)
中j
的frame[j]
是每个 2 × 2 像素切片的 V 值。 -
[M * N * 5/4, M * N * 6/4)
中k
的frame[j]
是每个 2 × 2 像素磁贴的 U 值。
-
因此,当您从 YUY2 转换为 YV12 时,您必须将 U 和 V 数据量减半,可能通过取两个相邻行的平均值。
例:
byte YUY2Source[M * N * 2] = /* source frame */;
byte YV12Dest[M * N * 3/2];
for (unsigned int i = 0; i != M * N; ++i)
{
YV12Dest[i] = YUY2Source[2 * i];
}
for (unsigned int j = 0; j != M * N / 4; ++j)
{
YV12Dest[M * N + j] = ( YUY2Source[N*(j / N/2 ) + 4 * j + 3]
+ YUY2Source[N*(j / N/2 + 1) + 4 * j + 3] ) / 2;
YV12Dest[M * N * 5/4 + j] = ( YUY2Source[N*(j / N/2 ) + 4 * j + 1]
+ YUY2Source[N*(j / N/2 + 1) + 4 * j + 1] ) / 2;
}
- 将 Y、U 和 V 值分隔到单独的数组中。
- 将 U 和 V 数组的偶数线和奇数线的值平均在一起,将两条线合并为一条。这会将这些数组的高度减半。Y 数组将
w * h
,U 和 V 数组现在将w/2 * h/2
。 - 连接 Y、V 和 U 数组。
相关文章:
- 防止主数据类型C++的隐式转换
- 模板参数替换失败,并且未完成隐式转换
- 努力将整数转换为链表。不知道我在这里做错了什么
- HEX值到wchar_t字符(UTF-8)的转换
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将 Qvector<uint8_t> 转换为 QString
- 如何在cuSparse中使用cusparseXcoo2csr从coo转换为csc
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 在c++中使用nlohmann从类到json的转换
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- 复制列表初始化的隐式转换的等级是多少
- 正在将指针转换为范围
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 是否可以从int转换为enum类类型
- 了解 GLM- openGL 中的相机转换
- 将 YUY2 转换为 YV12