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函数
- #include <stdio.h>
- #include <stdlib.h>
- #include <malloc.h>
- #include "yuv2rgb.h"
- #define u_int8_t unsigned __int8 //一个字节
- #define u_int unsigned __int32 //4个字节
- #define u_int32_t unsigned __int32
- #define FALSE false
- #define TRUE true
- //为了防止不同编译系统的int语法不同
- int main(int argc, char* argv[])
- {
- /* variables controlable from command line */
- u_int frameWidth = 352; /* --width=<uint> */
- u_int frameHeight = 240; /* --height=<uint> */
- bool flip = TRUE; /* --flip */
- unsigned int i;
- /* internal variables */
- char* rgbFileName = NULL;
- char* yuvFileName = NULL;
- FILE* rgbFile = NULL;
- FILE* yuvFile = NULL;
- u_int8_t* rgbBuf = NULL;
- u_int8_t* yBuf = NULL;
- u_int8_t*