【音视频】——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附图进行展示
【音视频】——yuv420p转rgb(原理+代码)_第1张图片

  • 但是真实的数据(c++中)就是一个向量。按下图进行索引计算。
    【音视频】——yuv420p转rgb(原理+代码)_第2张图片
  • 结果
    【音视频】——yuv420p转rgb(原理+代码)_第3张图片

3. Code

基于https://blog.csdn.net/leixiaohua1020/article/details/50534150项目上的实现

vs studio项目下载链接(良心的国内下载地址):https://gitee.com/chenjun2hao/simplest_mediadata_test.git

Reference

  1. https://blog.csdn.net/bemy1008/article/details/88766647#comments_12476085,非常感谢作者对于疑问的解答

你可能感兴趣的:(音视频,嵌入式AI)