本设计中使用的USB摄像头输出视频数据是YUV422格式,只有弄清楚了YUV数据格式,才能通过编程获取正确的视频数据,下面就分析一下YUV422数据格式。
YUV的原理是亮度信息Y与色度信息UV分离,其中"Y"表示明亮度(Lumina nce或Luma),也就是灰阶值;而"U"和"V"表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。当只提取Y信息的时候,视频呈现黑白画面,也就是常说的灰度图像。
常见的YUV格式有:YUV444 YUV422 YUV420.......
YUV422是两个亮度信息Y共用一对UV信息。
每种YUV数据格式根据YUV分量存储的方式不同,又分成平面格式和打包格式。平面格式是指先存完Y分量再存U分量,再存V分量。打包格式是指YUV三分量按照一定的采样格式存储。比如YUV422的一种打包格式就是Y0 U0 Y1 V0 Y2 U2 Y3 V2.......
下面在分析一下YUV数据格式表示的每个像素点占的空间大小:
YUV444:色度信号的分辨率和亮度信号的分辨率是相同的,单位像素占的字节数: (4+4+4)/4 = 3,4:4:4 格式是一个打包格式,其中每个像素都被编码为四个连续字节,AYUV 内存布局组织顺序如下所示(标记了 A 的字节包含 alpha 的值)
| U0 | V0 | Y0 | A0 | | U1 | V1 | Y1 | A1 | | U2 | V2 | Y2 | A2 | ......
YUV444------>32bitspp
YUV422:色度信号的扫描线数量和亮度信号一样多,但是每条扫描线上的色度采样点数却只有亮度信号的一半。单位像素占的字节数: (4+2+2)/4 = 2。
YUV422------>16bitspp
YUV422又分为两种格式:YUY2 UYVY
YUY2在内存的存放方式是:| Y0 | V0 | Y1 | V0 | | Y2 | U1 | Y3 | V1 | | Y4 | U2 | Y5 | V2 | ......
UYVY在内存的存放方式是:| U0 | Y0 | V0 | Y1 | | U1 | Y2 | V1 | Y3 | | U2 | Y4 | V2 | Y5 | ......
YUV420:无论是横向还是纵向,色度信号的分辨率都只有亮度信号的一半,单位像素占的字节数: (4+1+1)/4 = 1.5。
YUV420------>16bitspp
两种存放格式:
1、
| Y0 | Y1 | Y2 | Y3| ......
| U0 | U1 | ......
| V0 | V1 | ......
2、
| Y0 | Y1 | Y2 | Y3| ......
| V0 | V1 | ......
| U0 | U1 | ......
YUV经常有另外的名字, YCbCr ,其中Y与YUV 中的Y含义一致,Cb , Cr 同样都指色彩,,只是在表示方法上不同而已,Cb Cr 就是本来理论上的“分量/色差”的标识。C代表分量(是component的缩写)Cr、Cb分别对应r(红)、b(蓝)分量信号,Y除了g(绿)分量信号,还叠加了亮度信号。
RGB数据格式
RGB色彩模式通常用格式RGB(0,0,0)来表示颜色,括号中的3个数字分别表示红、绿、蓝的亮度值。如:黑色RGB(0,0,0)、白色RGB(255,255,255)、红色RGB(255,0,0)。
当红、绿、蓝三种颜色分量相同时就会形成灰色,比如RGB(128,128,128)。灰度颜色有256种变化,即从RGB(0,0,0)到RGB(255,255,255)共256种颜色。
RGB565
RGB565彩色模式, 一个像素占两个字节, 其中:
低字节的前5位用来表示B(BLUE)
低字节的后三位+高字节的前三位用来表示G(Green)
高字节的后5位用来表示R(RED)
Memory Layout如图:
RGB565,RGB555,RGB888的区别
正常的RGB24是由24位即3个字节来描述一个像素,R、G、B各8位。而实际使用中为了减少图像数据的尺寸,如视频领域,对R、G、B所使用的位数进行的缩减,如你所说的RGB565和RGB555。
RGB565 就是R-5bit,G-6bit,B-5bit
RGB555 就是R-5bit,G-5bit,B-5bit
RGB888 就是R-8bit,G-8bit,B-8bit ;其实这就是RGB24
至于Bitmap那是在RGB的像素数据基础上增加位图头数据而形成的文件格式。
一般BMP是RGB888, JPEG是YUV的。
RGB565 是16位的,2个字节,5+6+5,第一字节的前5位是R,后三位+第二字节前三位是G,第二字节后5位是B。
RGB555 也是16位的,2个字节,RGB各5位,有1位未用。
RGB888 是24位的,3个字节。
RGB数据的存放方式和YUV的打包格式存放方式相似。
YUV与RGB之间的换算:
RGB 转换成 YUV的标准公式
Y = (0.257 * R) + (0.504 * G) + (0.098 * B) + 16
Cr = V = (0.439 * R) - (0.368 * G) - (0.071 * B) + 128
Cb = U = -( 0.148 * R) - (0.291 * G) + (0.439 * B) + 128
YUV 转换成 RGB的标准公式
B = 1.164(Y - 16) + 2.018(U - 128)
G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)
R = 1.164(Y - 16) + 1.596(V - 128)
RGB取值范围均为0~255,Y=0~255,U=-122~+122,V=-157~+157
V'= (RY)*0.713
YUV转RGB的简化公式
R = Y + 1.403V'
G = Y - 0.344U' - 0.714V'
B = Y + 1.770U'