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月10日 下午4:20
下一篇 2022年4月10日 下午4:20


相关推荐

  • 2020年5月份编程语言排行榜「建议收藏」

    2020年5月份编程语言排行榜「建议收藏」前言本文章中语言排名数据来自TIOBE排行榜和PYPL排行榜。这段时间一直在忙,都忘记更新这个排行榜了,今天重操旧业,给大家看一下5月份的编程语言排行榜TIOBE排行榜5月份数据2020年5月TIOBE指数以下是官方说明五月标题:编程语言C又回到了第一位Java和C在4月份已经非常接近了,但是这个月C再次超越了Java。上一次C排名第一是在2015年。我们只能猜测为什么C又是第一名。其中一个原因可能是冠状病毒。这听起来可能很傻,但有些编程语言确实从这种情况中受益。数据科学领域的例子有P

    2022年5月31日
    63
  • pycharm更改背景颜色[通俗易懂]

    pycharm更改背景颜色[通俗易懂] 

    2022年8月29日
    8
  • ajax中设置header的Content-Type两种类型区别[通俗易懂]

    ajax中设置header的Content-Type两种类型区别[通俗易懂]post给服务器的数据类型是string,content-type有两种类型1、application/json发送给服务器的数据,会对数据进行JSON序列化2、application/x-www-form-urlencoded发送给服务器的数据,会将数据转化成querystring也就是说,content-type使用哪种类型,区别于服务器是怎么解析数据的。…

    2022年8月24日
    21
  • 实战篇:Oracle DataGuard 出现 GAP 修复完整步骤

    实战篇:Oracle DataGuard 出现 GAP 修复完整步骤OracleDataGu 出现 GAP 如何修复

    2026年3月20日
    1
  • 推荐10本必读的心理学书籍

    推荐10本必读的心理学书籍有小伙伴在知识星球说自己想学习心理学 让我推荐一些书籍 这里我就把我觉得还不错的一些心理学书籍推荐给大家 1 心理学与生活 理查德 格里格 菲利普 津巴多 心理学与生活 是美国斯

    2026年3月18日
    2
  • collection与collections区别

    collection与collections区别collection是一个接口。         他抽取出各种集合&lt;继承List和Set&gt;的主要功能,并做出统一行为规范。          他是很多集合的祖辈接口,没错父辈接口是List和Set。Collections是一个工具类。           工具类是工具,就像Math,Arrays类一样,他是一种工具,集成了很多特定的功能。           比如排…

    2022年6月13日
    28

发表回复

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

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