test01:YUV转RGB

YUV转RGB实验原理

由电视原理可知,亮度和色差信号的构成如下:

 

Y=0.2990R+0.5870G+0.1140B

 

R-Y=0.7010R-0.5870G-0.1140B

 

B-Y=-0.2990R-0.5870G+0.8860B

 

为了使色差信号的动态范围控制在0.5之间,需要进行归一化,对色差信号引入压缩系数。归一化后的色差信号为:

 

U=-0.1684R-0.3316G+0.5B

 

V=0.5R-0.4187G-0.0813B

易推得YUV到RGB空间的转换公式为:

R=Y+1.4075(V−128)

G=Y−0.3455(U−128)−0.7169(V−128)

B=Y+1.779(U−128)

色度格式

4:2:0格式是指色差信号U,V的取样频率为亮度信号取样频率的四分之一,在水平方向和垂直方向上的取样点数均为Y的一半。

RGB格式的视频按每个像素B、G、R的顺序储存数据;所占空间大小为Width*Height*Frame*3。

YUV格式的视频将整帧图像的Y打包存储,依次再存整帧的U、V,然后再是下一帧的数据;YUV格式按4:2:0取样的视频所占空间大小为Width*Height*Frame*1.5(Width*Height*Frame*+Width*Height*Frame*1/4+Width*Height*Frame*1/4)

YUV文件转换为RGB文件后,由于RGB文件的颜色是8bit量化,则数值不在0-255范围内的颜色会出现溢出。因此需对R,G,B做是否溢出的判断,超过255的就令其显示为255,小于0的就令其显示为0.

实验流程

1为两个文件开辟缓冲区。

2读取yuv文件,并写入。

3通过调用函数YUV2RGB将YUV文件转化为RGB文件。

4将RGB缓存写入文件中。

5释放缓冲区。

关键代码及其分析

main函数

  1. #include <stdio.h>  
  2. #include <stdlib.h>    
  3. #include <malloc.h>  
  4. #include "yuv2rgb.h"  
  5.   
  6. #define u_int8_t    unsigned __int8  //一个字节  
  7. #define u_int       unsigned __int32  //4个字节  
  8. #define u_int32_t   unsigned __int32  
  9. #define FALSE       false  
  10. #define TRUE        true  
  11. //为了防止不同编译系统的int语法不同  
  12. int main(int argc, char* argv[])  
  13. {  
  14.     /* variables controlable from command line */  
  15.     u_int frameWidth = 352;         /* --width=<uint> */  
  16.     u_int frameHeight = 240;        /* --height=<uint> */  
  17.     bool flip = TRUE;               /* --flip */  
  18.     unsigned int i;  
  19.   
  20.     /* internal variables */  
  21.     char* rgbFileName = NULL;  
  22.     char* yuvFileName = NULL;  
  23.     FILE* rgbFile = NULL;  
  24.     FILE* yuvFile = NULL;  
  25.     u_int8_t* rgbBuf = NULL;  
  26.     u_int8_t* yBuf = NULL;  
  27.     u_int8_t* 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值