视频像素数据
视频像素数据的来源及过程
从图像源有开始说起
一种源头是硬盘上的,其实更深的源头在于制作或者拍摄
先不说硬盘,先说拍摄
那就涉及到了摄像机.
摄像机的目的是把光学图象信号转变为电信号,以便于存储或者传输。
既然涉及到了转换,那就要谈起传感器
目前的数码摄像头传感器按照…分为两种
一种是CCD(电荷藕合)元件;另一种是CMOS(互补金属氧化物导体)器件。
CCD感光器件:
CCD全称为Charge Coupled Device,中文翻译为电荷藕合器件。它使用一种高感光度的半导体材料制成,能把光线转变成电荷,然后通过模数转换器芯片将电信号转换成数字信号,数字信号经过压缩处理经USB接口传到电脑上就形成所采集的图像。
CMOS感光器件:
CMOS全称为Complementary Metal-Oxide Semiconductor,中文翻译为互补性氧化金属半导体。CMOS的制造技术和一般计算机芯片没什么差别,主要是利用硅和锗这两种元素所做成的半导体,使其在CMOS上共存着带N(带–电) 和 P(带+电)级的半导体,这两个互补效应所产生的电流即可被处理芯片纪录和解读成影像。
从采集的角度来说,一般的视频采集芯片输出的码流一般都是YUV数据流的形式
有些手机基带芯片只能支持2M以下的YUV sensor,3M以上只能使用JPEG sensor
由于基带芯片不能处于码流太大的视频流,所以就要求在单位事件内对图像的数据表示的大小要尽量小.
一个图像尽量小,也就是说 分辨率 * 像素所占字节 小
分辨率能不能小呢?
像素所占字节能不能小呢?怎么才算是小呢?
sensor原理
Sensor的感光原理是通过一个一个的感光点对光进行采样和量化,但在Sensor中,每一个感光点只能感光RGB中的一种颜色
通常所说的30万像素或130万像素等,指的是有30万或130万个感光点。每一个感光点只能感光一种颜色。
要还原一个真正图像,需要每一个点都有RGB三种颜色
还原的话有几种方式
- 在Sensor模组的内部会有一个ISP模块,会将Sensor采集到的数据进行插值和特效处理
实例:
sensor输出为CCIR601或656的格式(YUV)
例如:如果一个感光点感应的颜色是R,那么,ISP模块就会根据这个感光点周围的G、B感光点的数值来计算出此点的G、B值,那么,这一点的RGB值就被还原了,然后在编码成601或656的格式传送给Host。
- 将没个感光点感应到的RGB数值直接传送给Host,由Host来进行插值和特效处理。
实例:
Sensor输出为RAW RGB格式
Raw RGB 每个像素只有一种颜色(R、G、B中的一种);
在手机摄像头的测试过程中,由sensor输出的数据就是Raw data(Raw RGB),经过彩色插值就变成RGB
RGB 每个像素都有三种颜色,每一个的值在0~255之间
sensor输出分为四种,一种是YUV,一种是raw RGB.一种为RGB,一种为JPEG
模组就是sensor
第一种,sensor输出的为YUV,
第二种,sensor输出的是Raw RGB(sensor的bayer阵列获取的数据(每种传感器获得对应的颜色亮度))
第三种,RGB:传统的红绿蓝格式,比如RGB565,其16-bit数据格式为5-bitR+6-bitG+5-bitB。G多一位,原因是人眼对绿色比较敏感
第四种:JPEG:有些sensor,特别是低分辨率的,其自带JPEGengine,可以直接输出压缩后的jpg格式的数据
第二种输出的数据不是图像的实际数据,模组测试时,就要写一个软件,完成数据采集(获得Raw data)->彩色插值(目的是获得RGB格式,便于图像显示)->图像显示;这样就可以发现整个模组是否正常,有无坏点,脏点的等,检测出不良品;(软件的处理过程当中,为了获得更好的图像质量,还需要白平衡,gamma校正,彩色校正)
对于第二种输出的数据,在手机的应用中,手机根据相机模组的数据格式,提供一个ISP(主要用于RGB格式的),配合软件,使照相功能得到应用
视频采集卡输出
sensor 的输出信号给到外围设备(可以是视频采集卡),然后由外围设备处理,然后输出.输出的数据交由电脑进行视频处理.
一般的外围设备给到内存的码流一般都是YUV数据流的形式.
视频处理
在这个阶段,输入为YUV数据,输出可以是H.264或MPEG.
视频处理都是在原始YUV码流进行编码和解析.
至于视频是按照什么格式流入的,是怎么对每帧图像进行判断的,怎么存储的,怎么编码的,怎么输出的,后来再说
视频显示
视频显示的话,输入为RGB数据,然后输出为图像.
至于输入的RGB数据时什么格式的,是怎么输出图像的,后来再说
视频存储
这个视频的存储是不是只是说视频在硬盘上的存储?
视频存储每帧中的每个像素可以用rgb表示,也可以用yuv表示
如果用rgb表示的话,只能用打包存储的方式存储,但是这种打包存储也分好几种存储格式
如果用yuv表示的话,可以用打包存储的方式,也可以用平面存储的方式存储.每种存储方式都对应好几种存储格式.
先说RGB
再说YUV
RGB与YUV
RGB中的R/G/B的取值范围都是[0,255]
Y = (0.257 * R) + (0.504 * G) + (0.098 * B) + 16
Cb = U = -(0.148 * R) - (0.291 * G) + (0.439 * B) + 128
Cr = V = (0.439 * R) - (0.368 * G) - (0.071 * B) + 128
Y的取值范围是[16,235.045]
U的取值范围是[16.055,239.945]
V的取值范围是[16.055,239,945]
一个亮度信号(Y)
红色差信号(R-Y)
蓝色差信号(B-Y)
严格上讲,色差信号共有三个,即R-Y,B-Y,G-Y。但只有两个是独立的,第三个可用另外两个求出。
YUV
YUV也是一种颜色编码方法,像素格式亮度参量和色度参量分开表示
- 可以避免相互干扰
- 降低色度的采样率而不会对图像质量影响太大
- 解决了彩色电视机与黑白电视的兼容问题
- YUV不像RGB那样要求三个独立的视频信号同时传输,所以用YUV方式传送占用极少的频宽。
主要用于电视系统以及模拟视频领域
YUV码流有多种不同的格式,要分析YUV码流,就必须搞清楚你面对的到底是哪一种格式,并且必须搞清楚这种格式的YUV采样和分布情况。
采样: 比例
分布:打包还是平面
平常所讲的YUV A:B:C的意思一般是指基于4个象素来讲,其中Y采样了A次,U采样了B次,V采样了C次.4个像素是一个宏像素
YUV 格式可以分为打包格式packed format和平面格式planar format。
- 打包格式将YUV分量存放在同一个数组中,通常是几个相邻的像素组成一个宏像素(macro-pixel);
- 平面格使用三个数组分开存放YUV三个分量,就像是一个三维平面一样。
Packed format和planner format的区别在于
- packed format中的YUV是混合在一起的,因此就有了UYVY、YUYV等等,他们在码流中排列的方式有所不同。
- 对于planner format每一个Y分量,U分量和V分量都是以独立的平面组织的,也就是说所有的U分量都在Y分量之后出现,而V分量在所有的U分量之后。就像三个大色块一样。
摄像头驱动
部分摄像头是UVC摄像头,就是是免驱的,驱动在内核中配置就好了.
// USB Video Class
CONFIG_MEDIA_SUPPORT=y
CONFIG_MEDIA_USB_SUPPORT=y
CONFIG_MEDIA_CAMERA_SUPPORT=y
CONFIG_VIDEO_DEV=y
CONFIG_I2C=y
CONFIG_VIDEO_V4L2=y
CONFIG_USB_VIDEO_CLASS=y
关于怎么看一个摄像头是不是免驱
http://www.cnblogs.com/emouse/archive/2013/03/03/2941938.html
而这个摄像头驱动是依照V4L写出来的,这个标准已经升级到第二版,所以是V4L2
函数
http://blog.chinaunix.net/uid-26101960-id-3297657.html
框架
http://blog.csdn.net/eastmoon502136/article/details/8190262/
通过V4L2的接口可以获得当前摄像头驱动所支持的所有数据格式以及分辨率等信息。
- UVC camera 内核数据流程
用户层代码
摄像头工具
luvcview -L
将摄像头插到Linux机器上,直接使用命令luvcview获得当前摄像头所支持的所有数据格式以及分辨率信息