一、本实验涉及到的基本原理
1.彩色空间转换的基本思想及转换公式
(1)YUV与RGB空间的相互转换(为了使色差信号的动态范围控制在0.5之间,需要进行归一化):
Y=0.2990R+0.5870G+0.1140B
U=-0.1684R-0.3316G+0.5B
V=0.5R-0.4187G-0.0813B
(2)RGB与YUV空间的相互转换
R=Y+1.14075(V-128)
G=Y-0.7169(V-128)-0.3455(U-128)
B=Y+1.779(U-128)
(3)色度格式
4:2:0格式是指色差信号U,V的取样频率为亮度信号取样频率的四分之一,在水平方向和垂直方向上的取样点数均为Y的一半。
(4)YUV与RGB存储方式
YUV文件采用平面(Planer)格式,使用三个数组分开存放每一帧的Y、U、V三个分量。
RGB文件采用打包(Packed)格式,将每一帧的每个像素点依照B、G、R的顺序存放在同一个数组中。
二、YUVtoRGB文件转换流程分析
1. 程序初始化(打开两个文件、定义变量和缓冲区 程序初始化(打开两个文件、定义变量和缓冲区等)
2. 读 读取 取YUV 文件,抽取YUV数据写入缓冲区 数据写入缓冲区
3. 调用YUV2RGB 的函数实现YUV 到RGB数据的转 数据的转换
4. 写RGB文件 文件
5. 程序收尾工作(关闭文件,释放缓冲区)
三、关键代码及其分析
1.YUVtoRGB.h
#ifndef YUV2RGB_H_
#define YUV2RGB_H_
int YUVtoRGB (int x_dim, int y_dim, void *bmp, void *y_out, void *u_out, void *v_out, int flip);
void InitLookupTable();
#endif
2.main.cpp
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include "YUVtoRGB.h" //自己定义的头文件
#define u_int8_t unsigned __int8 //无符号8位整形
#define u_int unsigned __int32 //无符号4字节整形
#define u_int32_t unsigned __int32
#define FALSE false
#define TRUE true
int main(int argc, char** argv)
{
/* variables controlable from command line */
u_int frameWidth = 352; /* --width=<uint&g