热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【专题8:摄像头】之【2.摄像头硬件】

嵌入式工程师成长之路系列文章总目录系列文章总目录希望本是无所谓有,无所谓无的,这正如脚下的路,其实地上本没有路,走的人多了&

嵌入式工程师成长之路 系列文章 总目录
系列文章总目录
希望本是无所谓有,无所谓无的,这正如脚下的路,其实地上本没有路,走的人多了,也便成了路
原创不易,文章会持续更新,欢迎微信扫码关注公众号
承接 小程序 / 嵌入式 / PC端项目开发,联系作者

在这里插入图片描述


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文件格式各不相同:
在这里插入图片描述


1974年,布莱斯.拜耳发明了拜耳滤镜,简单来说,就是在每个光电二极管上覆盖红、绿或蓝三种颜色中的一种颜色滤镜。
在这里插入图片描述
一个覆盖了红色滤镜的光电二极管只能让红光通过,这个二极管就只记录了红色光的强度,接着,拜耳又发明了拜耳组合,一个最基础的拜耳组合由2个绿色、一个红色和一个蓝色,共四个带拜耳滤镜的光电二极管组成2x2的结构。

通过多个拜耳组合就可以构成拜耳阵列,也就构成了图像传感器的感光器件。
在这里插入图片描述
由于发明了拜耳滤镜和拜耳阵列,布莱斯.拜耳被称为“数码影响之父”。

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

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

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

(1)CMOS摄像头组成:
在这里插入图片描述
把上面5个部分组合在一起,就组成了一个摄像头模组。把镜头拆掉,就可以看到CMOS sensor。
在这里插入图片描述
把CMOS sensor取下来:
在这里插入图片描述
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三个参数都是用来描述感光阵列的。



什么是感光阵列?


在这里插入图片描述
图中有颜色的部分就是感光阵列,把它提取出来后如下图所示:
在这里插入图片描述
从上图可以看出,感光阵列就是一个一个的颗粒,每个颗粒只能感受一种颜色,把红绿蓝组合在一起,就可以合成世间所有颜色。每个颗粒的尺寸大小就是像素点颗粒的大小。

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

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


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


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

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

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

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

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


5,数据的转换过程

以OV7740为例:

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

在这里插入图片描述
框图组成:
(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使用。
在这里插入图片描述
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摄像头控制器都匹配了,控制器才能正确接收摄像头的数据。

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


推荐阅读
author-avatar
要去治病啊8_r
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有