前言
本专栏将不间断更新有关C++音视频开发的内容,其中有初级章、中级章与高级章的内容,包括但不限于音视频基础、FFmpeg实战、QT、流媒体客户端、流媒体服务器、WebRTC实战、Android NDK等等。是博主花了将近5000元购买的课程中的知识点,其中也掺杂着一些我的个人理解,希望能帮助大家和我一起入门音视频开发。
------本专栏拒不收费!
【特别说明:本文属于初级篇中的视频基础知识的子内容。】
初级篇目录http://t.csdn.cn/rB3TA
其余篇章更新中...
【C++音视频开发】视频篇 | RGB与YUV
视频基础知识
1.RGB
1.1RGB的排列
2.YUV
2.1 YUV概念
2. 2 YUV采样表示法
2.3 YUV数据存储
视频基础知识
1.RGB
1.1RGB的排列
我们前面已经讲过了RGB色彩表示,这里我们重点讲解RGB的排列。
通常图像像素是按照RGB顺序进行排列的,但有些图像处理要转换成其他排列顺序,比如我们经常使用的OpenCv就经常转换为BGR的排列方式。
为什么需要转换为BGR这样子的排列呢?这其实是算法上的问题:
OpenCV在1999年由Intel建立,当时主流的摄像头制造商和软件供应商提供的摄像头采集的图像的通道排列顺序为BGR,另外对于图片,位图BMP是最简单的,也是Windows显示图片的基本格式,其文件扩展名为*.BMP。在Windows下,任何格式的图片文件(包括视频播放)都要转化为位图才能显示出来,各种格式的图片文件也都是在位图格式的基础上采用不同的压缩算法生成的,值得注意的是位图BMP的格式就是BGR。正是基于BGR在当时被广泛使用,于是早期OpenCV开发者就选择BGR颜色格式,这也就成为了一种规范一直用到现在。
上图是关于各种类型色彩通道的信息表示,根据以往的知识来分析十分的简单,在此处就不多费口舌了。
2.YUV
2.1 YUV概念
▲ 与我们熟知的RGB类似,YUV也是一种颜色编码方式,但是它是指:亮度参量(Y:Luminance或Luma)和色度参量(UV:Chrominace或Chroma)分开进行表示的像素编码格式。
▲ 将Y与UV分开的好处是什么呢?这样子做可以避免互相干扰,而且没有UV信息一样可以显示完整的图像,因而解决了彩色电视与黑白电视的兼容问题;还可以降低色彩的采样率而不会对图像质量有太多的影响,降低了视屏信号传输时对频宽(带宽)的要求。
▲ YY公用一组UV分量。
▲ YUV是一种比较笼统的说法,针对它的具体排列方式,可以分为很多种具体的格式:
- 打包(packed)格式:将每个像素点Y、U、V分量交叉排列并以像素点为单元连续存放在同一数组中,通常几个相邻的像素点组成一个宏像素(macro-pixel)
- 平面(planar)格式:使用三个数组分开连续的存放Y、U、V三个分量,即Y、U、V分别存放在各自的数组中。
2. 2 YUV采样表示法
▲ YUV采用A:B:C表示法来描述Y,U,V采样频率比例,下图中黑点表示采样像素点Y分量,空心圆表示采样像素点的UV分量。主要分为YUV 4:4:4 、YUV 4:2:2、YUV 4:2:0,这几种常用的类型。
★ 4:4:4 表示色度频道没有下采样,即一个Y分量对应着一个U分量和一个V分量。
★ 4:2:2 表示2:1的水平下采样,没有垂直下采样,即每两个Y分量共用一个U分量和一个V分量。
★ 4:2:0 表示2:1的水平下采样,2:1的垂直下采样,即每四个Y分量公用一个U分量和一个V分量。
2.3 YUV数据存储
▲ 下面每一个分量数据存储在一个char(或byte)中为例描述YUV的数据存储方式。
(1)- 4:4:4 格式
(2)- 4:2:2 格式
(3)- 4:2:0 格式
2.3.1——4:4:4格式
2.3.2 ——4:2:2格式
2.3.3——4:2:0格式