1,摄像头数据采集和显示的流程

自然景观 —> 摄像头模块 —> 接口 —> 开发板的摄像头控制器 —> LCD显示

摄像头模块和摄像头模组是同一个意思。

2,CMOS摄像头

图像传感器可以将光信号(模拟信号)转换为对应的电信号(数字信号),这也是CCD和CMOS的由来。CCD和CMOS是图像传感器的感光元件。

随着这几年的技术发展,基本上CMOS技术已经占据了绝对优势,CMOS技术的前景也远远好于CCD。CMOS更省电,读取更快,容易制造,成本更低;之前CCD所拥有的噪点少,颜色深,感光度高等优点随着CMOS技术的发展正一个个消失,只有在某些专业领域还在使用CCD。

由CMOS传感器组成的摄像头称为CMOS摄像头,我们现在看到的摄像头基本是CMOS摄像头。

CMOS传感器简称CIS,CMOS image sensor,如今的CIS内部都内嵌了一个ISP图像信号处理器,一般是一颗DSP芯片,可以对图像数据进行初步分析处理。

图像传感器的成像原理(了解):

图像传感器将投射到图像传感器上的光信号转换为电信号,之后再通过ADC以数字信号的形式输出给ISP。

图像传感器由数以千万计的光电二极管组成,每一个光电二极就是我们常说的一个像素。但图像传感器中的光电二极管只能记录光的强度(这个文件也就是RAW文件,它是通过传感器得到的最原始的图像文件,里面只有强度值,没有颜色值),不能记录光的颜色,那么,要怎么才能记录光的颜色呢?

不同的相机厂商的RAW文件格式各不相同:

BIOS相机 bios摄像头_滤镜

1974年,布莱斯.拜耳发明了拜耳滤镜,简单来说,就是在每个光电二极管上覆盖红、绿或蓝三种颜色中的一种颜色滤镜。

BIOS相机 bios摄像头_数据_02


一个覆盖了红色滤镜的光电二极管只能让红光通过,这个二极管就只记录了红色光的强度,接着,拜耳又发明了拜耳组合,一个最基础的拜耳组合由2个绿色、一个红色和一个蓝色,共四个带拜耳滤镜的光电二极管组成2x2的结构。通过多个拜耳组合就可以构成拜耳阵列,也就构成了图像传感器的感光器件。

BIOS相机 bios摄像头_滤镜_03


由于发明了拜耳滤镜和拜耳阵列,布莱斯.拜耳被称为“数码影响之父”。

这样就可以得到三幅最原始的图像,每幅图像都只有红绿蓝中的一种颜色,再将他们叠加在一起。

叠加在一起看到的图像并不是真实的图像,而是有很多的类似马赛克的东西,这时就需要ISP通过一定算法,譬如降噪和锐化,将其还原为真实的图像,这个过程称为解马赛克。

(1)图像传感器厂商
a.索尼:商品名Exmor,编号为IMX***,譬如IMX586。
b.三星:商品名ISOCELL,编号一般S开头的6位字符,譬如S5KGM1。
c.OmniVision(豪威科技(国产)):貌似没有商品名,编号一般为OV*****,譬如OV16885。

(1)CMOS摄像头组成:

BIOS相机 bios摄像头_滤镜_04


把上面5个部分组合在一起,就组成了一个摄像头模组。把镜头拆掉,就可以看到CMOS sensor。

BIOS相机 bios摄像头_BIOS相机_05


把CMOS sensor取下来:

BIOS相机 bios摄像头_数据_06


sensor部分是最核的心部件,它是一块芯片/传感器。

通过旋转镜头可以控制进入到CMOS传感器中的光的截面积。

3.信号的输入与输出格式

CMOS摄像头的输入信号:自然景观等的模拟信号。
CMOS摄像头的输出信号:RGB或RAW RGB或YUV格式的数字信号。

4.摄像头一些比较关键的参数

以OV7740为例:
(1)能输出的数据格式:RGB、RAW RGB、YUV

问:RGB和YUV分别是什么?
RGB和YUV是两种完全不同的颜色空间,他们直接可以相互转换。 详细介绍可以查看文章【专题3:电子工程师 之 上位机】 之 【40.音视频基础概念 (b)】

(2)能输出的像素大小
a. VGA:表640 * 480的分辨率
b. QVGA:表示240 * 320的分辨率
c. CIF:表示352 * 288的分辨率

(6)有效感光阵列的大小:656 * 488
(7)镜头的大小:1/5寸
(8)像素点颗粒的大小:4.2um * 4.2um

注: 6、7、8三个参数都是用来描述感光阵列的。

什么是感光阵列?

BIOS相机 bios摄像头_数字信号_07


图中有颜色的部分就是感光阵列,把它提取出来后如下图所示:

BIOS相机 bios摄像头_BIOS相机_08


从上图可以看出,感光阵列就是一个一个的颗粒,每个颗粒只能感受一种颜色,把红绿蓝组合在一起,就可以合成世间所有颜色。每个颗粒的尺寸大小就是像素点颗粒的大小。

所有的感光颗粒组成的感光阵列的尺寸大小就是镜头的大小,也就是1/5寸。

有效感光阵列的大小:表示每一行有656个颗粒(像素),每一列有488个颗粒(像素)。656 * 488 = 320128 ≈ 30万,也就是这个摄像头有30万的像素。

同一种像素大小的摄像头,其尺寸也可能会不同,这对摄像头的拍摄效果有什么影响呢?

譬如同为30万像素的摄像头,如果它的镜头尺寸大小越小,那么对应的像素点颗粒的大小就越小,从而感光性就越差,进而拍摄的效果就越差。

(8)输入的时钟频率:6 ~ 27 MHz
即OV7740摄像头模组的工作频率范围,工作频率也就是系统时钟。

(9)扫描模式
扫描模式有两种,隔行扫描和连续扫描。

连续扫描:一幅图片,从左到右,从上到下,依次扫描,直到扫描到最后。譬如一部电影为720P,这里的P就是连续扫描的意思。

隔行扫描:一幅图片,第一次从左到右,只扫描偶数行,第二次再从左到右,只扫描奇数行,也就是一幅图片一共扫描两次。譬如一部电影为1080I,这里的I就是隔行扫描的意思。

5,数据的转换过程

以OV7740为例:

数据的转换过程指:CMOS摄像头是如何将模拟信号转换为数字信号的。下图为数据转换过程框图。

BIOS相机 bios摄像头_BIOS相机_09


框图组成

(1)第一部分,image sensor core,简称isc

摄像头sensor只能感知(采集)红绿蓝三种颜色的信号,isc负责采集三颜色数据,并使用运算放大器将其放大,最后通过一个A/D转换器,将模拟信号转换为数字信号,这里的数字信号就是RAW RGB格式的数字信号。

RAW RGB和RGB的区别
RAW RGB指只有红绿蓝三种颜色的数据,或者说只能表示红绿蓝三种颜色的数据;而RGB指:除了能表示红绿蓝三种颜色,才能表示由红绿蓝三种颜色组成的任意颜色。

(2)第二部分,image sensor precessor,简称isp
图像数据处理,里面有一个最核心的部件:dsp。

ISP有两种含义,图像处理器和图像处理,前者是名词,是一个具体的器件,后者是一个动词,指图像处理的过程。

现代ISP,还会集成各种各样的功能性模块,如协处理器、AI加速单元、缓存等,可以把它理解为一颗SoC。它具有自动曝光、自动白平衡、镜头的自动对焦、暗角和畸形的自动修复矫正以及人脸识别等功能。

此外,通过集成视频解码模块到ISP中,也可以实现对视频录制的支持。

ISP会根据图像传感器记录的数据,输出成一张张图片,每张照片为视频中的一帧图像,之后再通过视频解码器将这些图片合成为视频。一般是以H.264或H.265编码记录。

自动白平衡(AWB)、自动曝光(AE)和自动对焦(AF)功能称为视频监控A3算法。

(3)第三部分,image output interface,图像输出单元,简称ioi
第二步处理的数据会传到这里进行输出。

各部分都做了哪些核心工作:
(1)isc部分:
对图像的翻转,增益大小跳转,黑电平校准,饱和度的控制、OTP存储器(里面存储了厂家信号,芯片信息)。

(2)isp部分:

a.提供测试功能:如果将摄像头设置为测试模式,它会直接把isc屏蔽掉,直接产生以下图像数据给isp使用。

BIOS相机 bios摄像头_数字信号_10


b.镜头补偿功能

c.自动白平衡校准功能

d.颜色空间的转换功能:将RGB转换为YUV格式数据

e.将RAW RGB格式数据转换为RGB格式数据

f.窗口功能:将采集到的原始图片进行裁剪

g.缩小放大功能

以上功能都是通过isp中的dsp单元完成处理的,如果要研究各个功能的实现细节,就需要阅读摄像头的芯片手册,研究isp章节。

(3)ioi部分:
a.设置输出的数据格式:是RAW RGB、还是RGB、还是YUV格式。

b.输出的面积是多少:是VGA、还是QVGA。

c.通过什么方式进行数据传输:是BT601方式,还是BT656方式传输,这其实就是和SoC摄像头控制器的接口。

问:以上的处理过程(尤其是isp部分),是摄像头模组自动完成的吗?需不需要人为设置什么?

以上的处理过程,绝大部分都是需要我们人为设置后,才能完成。

问:怎么对它们进行设置?

通过查询数据手册上写明的特性(features)可以看到,摄像头模组通过标准的SCCB总线接口和外部进行通信的,SCCB总线就是指I2C总线。

总结:
我们可以通过I2C总线对摄像头模组进行设置,让其输出我们想要的数据。摄像头模组里面有很多的寄存器,通过I2C总结对其进行读写。

6,摄像头硬件接口

(1)IICSDA:i2c总线的数据线
(2)IICSCL:i2c总线的时钟线

(3)CAMRST:camera reset,摄像头复位引脚
(4)CAMCLK:摄像头模块的系统时钟,譬如OV7740设置为24MHz

接下来的引脚就和LCD的引脚类似了。
(5)CAM_HREF:行同步信号。
(6)CAM_VSYNC:帧同步信号。
(7)CAM_PCLK:像素时钟。
(8)CAMDATA0 - CAMDATA7:数据总线

类比:摄像头通过摄像头接口传数据和LCD通过LCD接口传数据的形式完全一样的。

总结:CMOS摄像头的接口分类两类:
a.第一类是控制类,也就是i2c总线;作用:初始化摄像头,让摄像头模块正常的输出摄像头数据;控制:设置亮度、旋转、缩放等操作。

b.第二类是数据传输类,与LCD的接口完全一样。

总结: CMOS摄像头模式,本质上就是一个i2c设备,需要给它写符合i2c设备的驱动,从而实现初始化和灵活地控制。

7.SoC摄像头控制器

以S3C2440为例:

SoC摄像头控制器的输入(在其数据手册中有写明):
(1)支持BT601或BT656
(2)支持最大分辨率:4096 * 4096
(3)只支持8bit的YUV格式

问:BT601和BT656的传输方式有什么区别?

BT601有独立的行同步信号线,有独立的帧同步信号线。而BT656是将这两种信号内嵌到数据中。

但是摄像头模块采集的数据的规格为:648 * 480、BT601方式传输。

所以需要设置SoC摄像头模块的相关寄存器来告诉SoC摄像头控制器输入源的信号规格。

摄像头控制器接收到数据之后,首先通过窗口功能进行裁剪,裁剪之后的数据有两种处理方式:

(1)进入预览通道,预览通道的图像分辨率比较小,只有640 * 480,同时也可以进行缩放或旋转(譬如旋转90°)或颜色空间转换;有一个专门的DMA通道,设置好后,可以直接将图像数据转移到内存的指定地方,这个指定的内存称为缓存。预览通道只能支持RGB16/24格式的数据。

(2)进入编码通道:可以进行缩放,然后进行编码,能处理最大4096 * 4096大小分辨率的图像。这里也有一个专门的DMA,称为编码DMA,也是将处理后的数据转移到内存的指定地方。输出的数据格式为YCbCy420或YCbCy422。

总结:
要把摄像头采集到的数据在LCD上进行显示,只需要把缓存中的数据拷贝到LCD的显存中就可以了。而对图像数据的缩放或旋转等操作,都可以操作SoC摄像头控制器来完成。

SoC摄像头控制器的中断信号:

(1)采集第0帧数据
在第1帧的帧同步信号产生下降沿时,产生一个irq,在irq函数中可以去处理第0帧的数据

(2)采集第1帧数据
在第2帧的帧同步信号产生下降沿时,产生一个irq,在irq函数中可以去处理第1帧的数据
.
.
.

从以上分析可以看出,要想理解或写整个linux摄像头驱动,需要熟悉I2C驱动,平台驱动,LCD驱动以及V4L2驱动。

8.驱动组成

从上面的内容中可以了解到,CMOS摄像头其实就是一个i2c设备,所以我们需要写一个linux i2c设备驱动,通过这个驱动来控制摄像头模组,让其输出我们想要的规格的图像,譬如让其输出分辨率为640 * 480、帧率为30fps的YUV格式数据,并通过BT601方式往外输出。

同时,SoC摄像头控制器可以支持很多种规格的摄像头,所以要通过配置SoC摄像头控制器的寄存器让其适配我们接入到开发板的摄像头,也就是把控制器的数据输入格式(这里设置为YUV格式),接口方式(这里设置为BT601)等等。

只有摄像头模块和SoC摄像头控制器都匹配了,控制器才能正确接收摄像头的数据。

所以这里需要写一个平台设备驱动