yuv422转rgb(422sp转420p)

YUV420转RGB888yuv420的数据存储方式是planar,就是在一帧中先存y分量,存完y存u,接着v分量。而在yuv420中有y分量widthheightbyte,uv分量各是widthheight1/4,一帧中总的数据是widthheight3/2(widthheight12/8).所以当时认为,yuv分量代入转换公式的话,uv分量是不是少了。其实不然,因为是每四个y分量共用一个u分量一个v分量,但也不是[YiYi+1Yi+2Yi+3]共用[Ui],[Vi],因为是一个22的窗口内的Y分量

大家好,又见面了,我是你们的朋友全栈君。

YUV420转RGB888

yuv420的数据存储方式是planar,就是在一帧中先存y分量,存完y存u,接着v分量。而在yuv420中有y分量widthheight byte,uv分量各是widthheight1/4,一帧中总的数据是widthheight3/2(widthheight12/8).所以当时认为,yuv分量代入转换公式的话,uv分量是不是少了。其实不然,因为是每四个y分量共用一个u分量一个v分量,但也不是[YiYi+1Yi+2Yi+3]共用[Ui],[Vi],因为是一个22的窗口内的Y分量共用一个uv,所以[YiYi+1Yi+wYi+w+1],其中i是偶数。uv分量由于是分别按水平方向和垂直方向2:1采样,所以[U(i/2*w/2+j/2)],V分量同理。

#include <iostream>
#include <stdio.h>
#include<fstream>

using namespace std;

bool yuv420ToRgb(char *yuv, int w, int h, char *rgb)
{ 
   
	unsigned char *y = new unsigned char[w*h];
	unsigned char *u = new unsigned char[w*h / 4];
	unsigned char *v = new unsigned char[w*h / 4];

	memcpy(y, yuv, w*h);
	memcpy(u, yuv + w * h, w*h / 4);
	memcpy(v, yuv + w * h * 5 / 4, w*h / 4);

	for (int i = 0; i < h; i++)
	{ 
   
		for (int j = 0; j < w; j++)
		{ 
   
			rgb[i*w*3 + 3*j] = 1.164*(y[i*w+j] - 16) + 1.596*(v[i / 4 * w + j / 2] - 128);//R

			rgb[i*w*3 + 3*j+1] = 1.164*(y[i*w + j] - 16) - 0.392*(u[i / 4*w+j/2] - 128) - 0.813*(v[i / 4 * w + j / 2] - 128);//G

			rgb[i*w*3 + 3*j+2] = 1.164*(y[i*w + j] - 16) + 2.017*(u[i / 4 * w + j / 2] - 128);  //B
		}
	}
	free(y);
	free(u);
	free(v);
	return true;
}


int main(int argc, char* argv[])
{ 
   
	FILE *yuv, *out;	
	int len = 832 * 480 * 3 / 2;
	char  *yuvbuff = ( char *)malloc(len);
	char  *rgbbuff = ( char *)malloc(len*2);
	char  *buff = (char *)malloc(len * 2);
	yuv = fopen("D://movie player//BasketballDrill_832x480_50.yuv", "rb");
	out= fopen("D://movie player//rgb888.txt", "wb+");

	ifstream fl("D://movie player//BasketballDrill_832x480_50.yuv", ios::binary);
	fl.seekg(0, ios::end);
	int size = fl.tellg();
	int inFrameNum = (width*height * 3 / 2);
	int frameNum = size / inFrameNum;

	for (int i = 0; i <frameNum; i++) { 
   
		fread(yuvbuff, 1, width*height * 3/2, yuv);
		yuv420ToRgb(yuvbuff, width, height, rgbbuff);
	    fwrite(rgbbuff, 1, width*height * 3 ,out);
	}
		return 0;
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/127840.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 摘星-上升篇

    以下内容均来自阳光占星,如有冒犯,告知删除!上升金牛——歌者的哼唱有这么一类人,可能有着细致柔和的五官,容易发胖的体质以及坚定的眼神。有点害羞与腼腆;喜欢哼唱着小曲,不喜欢拥挤的人群而喜欢宁静的自然。这样的一群人就是生活在我们身边的上升金牛。他们喜欢舒缓的生活节奏,喜欢按照自己的节奏去一点点的完成计划,不喜欢突如其来的变动扰乱了自己的生活。金牛是一个喜欢稳定和安逸的星座,并且由于金牛的守护星为金星,上升金牛也诞生出更多的艺术色彩。但上升金牛的审美一直被吐槽,旁人就必须忍受他那万年…

    2022年4月6日
    74
  • JAVA reference_Java instanceof

    JAVA reference_Java instanceof本文介绍对象的强、软、弱和虚引用的概念、应用。1.对象的强、软、弱和虚引用  在JDK1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象。也就是说,只有对象处于可触及(reachable)状态,程序才能使用它。从JDK1.2版本开始,把对象的引用分为4种级别,从而使程序能更加灵活地控制对象的生命周期。这4种级别由高到低依次为:强引用、软引用、弱引用和虚引用。

    2025年10月7日
    3
  • python中astype 存在空值_python-DataFrame.astype()错误参数

    python中astype 存在空值_python-DataFrame.astype()错误参数使用列的字典时,astype引发ValueError.我试图将大DF中的稀疏列的类型转换(从float到int).我的问题是NaN值.即使将errors参数设置为’ignore’,使用列的字典时也不会忽略它们.这是一个玩具示例:t=pd.DataFrame([[1.01,2],[3.01,10],[np.NaN,20]])t.astype({0:int},errors=’ignore’)V…

    2022年5月25日
    77
  • pycharm解析器找不到

    pycharm解析器找不到

    2021年10月21日
    49
  • 树莓派4B 安装opencv完整教程基于python3(各种错误解决)

    树莓派4B 安装opencv完整教程基于python3(各种错误解决)本人一直在做opencv的项目,需要入手一块树莓派来在移动端跑opencv,所以买了一块树莓派4B,然后安装上了系统,开启了曲折的opencv安装之旅。首先有幸看到子豪兄的视频,还是很好的,所以直接跟着它子豪兄教你在树莓派上安装OpenCV教程安装opencv,但是后来发现各种不可名状的错误,最后发现他的是基于树莓派3B+,环境是python3.5,但是树莓派4B的环境是python4B,所以不…

    2022年6月11日
    61
  • vue slot插槽_vue3 slot插槽

    vue slot插槽_vue3 slot插槽为什么使用slotslot(插槽)在生活中很多地方都有插槽,电脑usb的插槽,插板当中的电源插槽插槽的目的是为了让我们原来的设备具备更多的扩展性比如电脑的USB我们可以插入U盘,手机,鼠标,键

    2022年7月31日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号