【音视频】——yuv420p转rgb(原理+代码)
作者:互联网
1. 背景
在嵌入式设备上进行神经网络推理的时候,很多时候涉及到yuv420p数据转rgb(如HI3519a等)。
2. 实现
首先贴源码:
bool YUV420_TO_RGB24(unsigned char *yuvBuf, int w, int h, unsigned char *rgbBuf)
{
int index_y, index_u, index_v;
unsigned char y, u, v;
unsigned char r, g, b;
for (size_t i = 0; i < h; i++)
{
for (size_t j = 0; j < w; j++)
{
index_y = i * w + j;
index_u = w * h + i / 4 * w + j / 2;
index_v = w * h * 5 / 4 + i / 4 * w + j / 2;
y = yuvBuf[index_y];
u = yuvBuf[index_u];
v = yuvBuf[index_v];
b = y + 1.772*(u - 128); //B = Y +1.779*(U-128)
g = y - 0.34413*(u - 128) - 0.71414*(v - 128); //G = Y-0.3455*(U-128)-0.7169*(V-128)
r = y + 1.402*(v - 128); //R = Y+1.4075*(V-128)
*(rgbBuf++) = clip_value(r, 0, 255);
*(rgbBuf++) = clip_value(g, 0, 255);
*(rgbBuf++) = clip_value(b, 0, 255);
}
}
return true;
}
原理
- 代码中最关键的部分就是u/v的索引计算
- yuv420p图像数据的排列,显示w * h的y,然后是w * h / 4 的u和 w*h/4的v
- 所以在yuv420转rgb的时候,总的规则是:对y以2为窗口,使用1个u和1个v
这里用1附图进行展示
- 但是真实的数据(c++中)就是一个向量。按下图进行索引计算。
- 结果
3. Code
基于https://blog.csdn.net/leixiaohua1020/article/details/50534150项目上的实现
vs studio项目下载链接(良心的国内下载地址):https://gitee.com/chenjun2hao/simplest_mediadata_test.git
Reference
标签:index,rgbBuf,++,unsigned,音视频,rgb,yuv420p,128,yuvBuf 来源: https://blog.csdn.net/u011622208/article/details/106633706