【音视频】——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

  1. https://blog.csdn.net/bemy1008/article/details/88766647#comments_12476085,非常感谢作者对于疑问的解答
  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值