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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • android中遍历arrayList的四种方法[通俗易懂]

    android中遍历arrayList的四种方法[通俗易懂]packagecom.mylist.test;importjava.util.ArrayList;importjava.util.Iterator;importjava.util.List;publicclassArrayListDemo{   publicstaticvoidmain(Stringargs[]){       Listlist

    2022年7月22日
  • IDEA教程之Activiti插件[通俗易懂]

    IDEA教程之Activiti插件[通俗易懂]本文作者:Spring_ZYL意见反馈:15065421873@163.com文章来源:https://blog.csdn.net/gozhuyinglong版权声明:本文版权归作者所有,转载请注明出处一、安装Activiti插件1.搜索插件点击菜单【File】–&gt;【Settings…】打开【Settings】窗口。点击左侧【Plugins】…

    2022年6月10日
  • JAVA连接Redis客户端多种方式实现

    JAVA连接Redis客户端多种方式实现Jedis介绍Redis不仅使用命令来操作,而且可以使用程序客户端操作。现在基本上主流的语言都有客户端支持,比如java、C、C#、C++、php、Node.js、Go等。在官方网站里列一些Java的客户端,有Jedis、Redisson、Jredis、JDBC-Redis、等其中官方推荐使用Jedis和Redisson。Jedis同样也是托管在github上,地址:https://github.com/xetorthio/jedis<dependencies>..

    2022年6月9日
  • js二维码生成

    详细介绍可以查看API网站:http://code.ciaoca.com/javascript/qrcode/ (前端开发仓库)一、引入js文件&amp;lt;!– 第一步:引进js文件 –&amp;gt; &amp;lt;script type=”text/javascript” src=”js/jquery.min.js”&amp;gt; \ &amp;lt;script type=”text/java…

    2021年11月30日
  • a算法求解八数码问题_a*算法解决八数码问题python

    a算法求解八数码问题_a*算法解决八数码问题python前面见过宽度优先搜索和深度优先搜索求解八数码问题。那两个方法都是盲目搜索。今天看启发式搜索。A算法:利用评价函数来选择下一个节点。图引用自-北京联合大学彭涛老师在中国慕课的《人工智能概论》。估价函数没有定论,可以有不同方法。这里采用处在错误位置的数字的数量。代码在:github一组测试数据的执行搜索的过程如下:A*算法(宽度优先)求解八数码问题==========宽度优先求解八数码问题,搜索过程是==========[[203..

    2022年10月26日
  • Swiper滑动Html5手机浏览器自适应

    Swiper滑动Html5手机浏览器自适应

    2022年1月30日

发表回复

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

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