1,YUV420P
若视频帧的宽和高分别为w和h
1,一帧YUV420P像素数据一共占用w*h*3/2 Byte的数据;
2,其中前w*h Byte存储Y;
3,接着的w*h*1/4 Byte存储U;
4,最后w*h*1/4 Byte存储V。
eg:
先有一张分辨率为256x256图片,其中:
1,纯Y数据,分辨率为256x256;
2,纯U数据,分辨率为128x128;
3,纯V数据,分辨率为128x128;
如果想把YUV格式像素数据变成灰度图像,只需要将U、V分量设置成128即可。
这是因为U、V是图像中的经过偏置处理的色度分量。色度分量在偏置处理前的取值范围是-128至127,这时候的无色对应的是“0”值。经过偏置后色度分量取值变成了0至255,因而此时的无色对应的就是128了。
2,YUV444P
若视频帧的宽和高分别为w和h
1,一帧YUV444P像素数据一共占用w*h*3 Byte的数据;
2,前w*h Byte存储Y;
3,接着的w*h Byte存储U;
4,最后w*h Byte存储V;
eg:
先有一张分辨率为256x256图片,其中
1,Y,U,V各数据,分辨率为256x256
3,BMP格式:BMP采用的是小端(Little Endian)存储方式。这种存储方式中“RGB24”格式的像素的分量存储的先后顺序为B、G、R。由于RGB24格式存储的顺序是R、G、B,所以需要将“R”和“B”顺序作一个调换再进行存储。
BMP组成 |
---|---
BITMAPFILEHEADER |
BITMAPINFOHEADER |
RGB像素数据 |
typedef struct tagBITMAPFILEHEADER
{
unsigned short int bfType; //位图文件的类型,必须为BM
unsigned long bfSize; //文件大小,以字节为单位
unsigned short int bfReserverd1; //位图文件保留字,必须为0
unsigned short int bfReserverd2; //位图文件保留字,必须为0
unsigned long bfbfOffBits; //位图文件头到数据的偏移量,以字节为单位
}BITMAPFILEHEADER;
typedef struct tagBITMAPINFOHEADER
{
long biSize; //该结构大小,字节为单位
long biWidth; //图形宽度以象素为单位
long biHeight; //图形高度以象素为单位
short int biPlanes; //目标设备的级别,必须为1
short int biBitcount; //颜色深度,每个象素所需要的位数
short int biCompression; //位图的压缩类型
long biSizeImage; //位图的大小,以字节为单位
long biXPelsPermeter; //位图水平分辨率,每米像素数
long biYPelsPermeter; //位图垂直分辨率,每米像素数
long biClrUsed; //位图实际使用的颜色表中的颜色数
long biClrImportant; //位图显示过程中重要的颜色数
}BITMAPINFOHEADER;
4,RGB转YUV
Y= 0.299*R+0.587*G+0.114*B
U=-0.147*R-0.289*G+0.463*B
V= 0.615*R-0.515*G-0.100*B
**注意公式的由来,参考前两节
在转换的过程中有以下几点需要注意:
1) RGB24存储方式是Packed,YUV420P存储方式是Packed。
2) U,V在水平和垂直方向的取样数是Y的一半。