嵌入式工程师成长之路 系列文章 总目录
系列文章总目录
希望本是无所谓有,无所谓无的,这正如脚下的路,其实地上本没有路,走的人多了,也便成了路
原创不易,文章会持续更新,欢迎微信扫码关注公众号
承接 小程序 / 嵌入式 / 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摄像头控制器都匹配了,控制器才能正确接收摄像头的数据。

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

【专题8: 摄像头】 之 【2.摄像头硬件】相关推荐

  1. OpenCv实时设置摄像头参数/获得摄像头参数值的方法论

    OpenCv实时设置摄像头参数/获得摄像头参数值的方法论 一.提醒: 在开始,摄像机修改之旅之前,出于负责任的态度.我想我需要提醒以下三点: 一.一旦你修改了这些参数,你的摄像头就被改动了,这是永久的 ...

  2. 【前端vue——系列6】vue连接摄像头并实现摄像头暂停,计时,截图到本地等功能

    系列文章总结 [前端vue--系列1]vue的路由 [前端vue--系列2]vue中的data是函数而不是对象与computed的实现原理 [前端vue--系列3]vue框架的优缺点:vue实现双向绑 ...

  3. C# usb摄像头拍摄 支持摄像头自身快照按钮

    C# usb摄像头支持摄像头自身快照按钮 AForge库 窗体效果图 硬件快照按钮事件 代码 最近一个项目需要,控制usb摄像头进行拍摄,特别是支持摄像头自身的快照按钮进行快速拍摄,项目是用C#写的, ...

  4. 软件c#语言调用摄像头,C#调用摄像头的几种方式

    C#调用摄像头的方式 本文将讲诉在C#的winform程序中如何调用摄像头: 1.调用USB摄像头 2.调用普通IP摄像头 3.通过摄像头SDK进行调用 使用的DLL 首先给上我所使用的DLL 调用U ...

  5. 目标检测学习笔记-3D摄像头与 2D摄像头区别

    1. 2D&3D 的定义 首先2D,3D 的D 是什么意思?D 全称是Dimensional,翻译中文为维度.中文解译2D,3D 为二维,三维. 2. 2D 和3D 区别 如果从数学,物理角度 ...

  6. Unity3D 对于在VR中普通摄像头和VR摄像头同时存在——分屏

    这两天在研究关于VR的分屏,由于甲方要求需要在VR运行时,有多个一般的摄像头像监控一样定点存在场景中. 而且能同时在屏幕上看到,我查了很多资料,并没有查到相关特别好的资料,只能找到如下的解决方案. 解 ...

  7. [相机选型] 普通网络摄像头或小型摄像头和工业相机的区别

    总结普通的网络摄像头或小型摄像头和工业相机之间的区别: 罗技网络摄像头C920: 淘宝上的小型摄像头 区别: 1.快门类型不同: 工业相机大部分为全局快门,小型的或者网络摄像头一般为卷帘快门. 全局快 ...

  8. 树莓派(5):CSI摄像头 vs USB摄像头

    CSI摄像头 vs USB摄像头 0. 前言 1. 准备工作 2. CSI摄像头 2.1 安装摄像头 2.2 安装驱动 2.3 测试 3. USB摄像头 4. 二者对比 4.1 型号说明 4.2 成像 ...

  9. opencv启动摄像头并且操作摄像头拍照

    提示:代码由pycharm实现 文章目录 前言 一.引入库 二.步骤 1.开启摄像头 2.设置一个变量方便后面保存图片 3.设置循环检测 总结 前言 本次我们记录OpenCV的启用电脑的摄像头以及对摄 ...

  10. 在ROS平台上标定普通摄像头与Kinect摄像头

    摄像头为什么要标定 摄像头是一种非常精密的光学仪器,它对外界环境的感知是非常敏感的.由于摄像头内部和外部的一些原因,生成的物体图像常常会发生一定的畸变,例如在鱼眼摄像头,畸变是非常大的,如果直接将采集 ...

最新文章

  1. 浅谈Hive和HBase区别
  2. WebGL Shader 环境搭建
  3. skb_shinfo(skb)-dataref 含义
  4. ionic3 cordova ionic-native插件
  5. java 优化线程_Java | 多线程调优(下):如何优化多线程上下文切换?
  6. linux分区理解整理
  7. html表单制作及实例问卷好吗,问卷网上制作问卷、表单、测评的区别
  8. 电机FOC电流环参数整定
  9. 企业微信群机器人入门
  10. linux文件误删除该如何恢复?
  11. k8s的优势和部署模式
  12. java 生成csv文件_Java生成CSV文件实例详解
  13. RMAN crosscheck archivelog all; 失败!
  14. PMP计算题笔记(净现值、投资回收期、PERT、总价加激励、成本加激励)
  15. 选择隔离电源还是非隔离电源?
  16. 使用MyEntunnel和Proxifier搭建代理服务器
  17. OSChina 周三乱弹 ——我们职业更好的名字:爱码士
  18. Vivado 综合约束实用命令(更新中……)
  19. 第一章 Hadoop
  20. 使用python在Lotus Notes发送邮件

热门文章

  1. 亚马逊、Lazada、阿里国际、eBay、Temu、Ozon好消息不断,机会来了
  2. codeblocks如何调试
  3. android createbitmap,慎用Bitmap.createBitmap
  4. I3 Dialer之蜻蜓点水(一)
  5. JSONArray遍历
  6. [PS基础] Photoshop通道在图像处理中的应用 —通道起源
  7. 机器学习实战之Logistic回归(四)从疝气病症状预测病马的死亡率(含数据集)
  8. Linux下通过bonding技术实现网络负载均衡及冗余
  9. Redis相关学习笔记
  10. 20170515_建立排序二叉树BST