摄像头机器视觉人工智能的"眼睛",其重要性在嵌入式领域不言而喻。但是如何理解和使用摄像头却是一个非常棘手的问题。本文主要针对调试摄像头过程中遇到的问题,对摄像头的基本原理及概述进行整理,同时对自己在实际工作中遇到的问题进行梳理总结。
1.简介
2.摄像头模组基本构造与工作原理
2.1 基本构造
2.1.1 镜头Lens
2.1.2 IR Filter红外滤镜
2.1.3 Sensor
2.2 数据输出
2.2.1 输出格式
2.2.2 ISP
2.2.3 行场同步信号
3.硬件设计与接口定义
3.1 上下电时序
3.2 PCLK \D1~D7
3.3 Camera Interface Module (CIM)
4.驱动与调试
4.1 Sensor 的初始化步骤
4.1.1 I2C与SCCB总线协议
4.2 摄像头问题及解决办法汇总
4.2.1 名称解释
4.2.2 图像传感器图像问题总汇
5. 总结
1.简介
目前,包括移动设备在内的很多 多媒体设备上都使用了摄像头,而且还在以很快的速度更新换代。目前使用的摄像头分为两种:CCD(Charge Couple Device电荷偶合器件)和 CMOS(Complementary Metal Oxide Semiconductor互补金属氧化物半导体)。
这两种各有优劣:目前CCD主要使用高质量的DC、DV,数码相机和高档手机上,其图像质量较好,但是整个驱动模组相对比较复杂,而且目前只有曰本一些企业掌握其生产技术,对于选用的厂商来说成本会比较高昂,而且一些设备对与图像质量没有很苛刻的要求,对体积要求会高一些;而CMOS正好满足这样的要求,CMOS模组则比较简单,目前很多厂商已经把驱动和信号处理的ISP(Image Signal Processor)集成在模组内部,这样体积就更小,而且其生产技术要求相对简单、工艺比较成熟、成本较低、外围电路简单、图像质量也可以满足一般的要求,所以在嵌入式市场中占有很大份额,目前一些高端的CMOS Sensor的质量已经可以和CCD 的质量相媲美。
本文主要是围绕CMOS摄像头进行软件开发与调试,对之前的OV7740,OV7725及GC2155摄像头的驱动调试经验上进行技术总结。对前面开发过程中遇到的问题进行回顾,同时对之前网上收集的资料进行一下整理。
2.摄像头模组基本构造与工作原理
要认识CMOS摄像头的结构。我们通常拿到的是集成封装好的模组,一般由4个部分组成:FPC(柔性电路板),镜头、感应器与图像信号处理器构成。一般情况下,集成好的模组我们只看到外面的镜头、接口和封装壳,这种一般是固定焦距的。有些厂商只提供芯片,需要自己安装镜头,镜头要选择合适大小的镜头,如果没有夜视要求的话,最好选择带有红外滤光的镜头,因为一般的sensor都能感应到红外光线,如果不滤掉,会对图像色彩产生影响,另外要注意在PCB设计时要保证镜头的聚焦中心点要设计在sensor的感光矩阵中心上。除了这点 CMOS Sensor硬件上就和普通的IC差不多了。
2.1 基本构造
镜头(LENS):透镜结构,有机玻璃和石英;
基座(LENS Base):用于固定镜头
图像传感器:
CCD(charge-coupled device) :电荷耦合器件
CMOS(complementary metal oxide semiconductor):互补金属氧化物半导体
DSP数字处理电路:AD转换器
电源:两种工作电压:3.3V和2.5V;
2.1.1 镜头Lens
光是一种波,可见光只是整个光波中的一段。Lens就是一个能够截止不可见光波,而让可见光通过的带通滤波器。
镜头lens的主要规格参数有
1)有效焦距EFL:effective foce length
2)视场角FOV:field of view
视场角在光学工程中又称视场,视场角的大小决定了光学仪器的视野范围。
3)光圈F/NO:
光圈能调节进入镜头里面的光线的多少,举例来说:家养的小猫,白天的瞳孔总是缩成一条线,到了晚上,就自动地打开成为一个圆孔。所以,同样道理,在拍照时,光线强烈,就要缩小光圈,光线暗淡,就要开大光圈。也就是说F值越小的相机(其他参数不变),越有利于夜景拍摄。
光圈数越小,入射光的镜头孔径越大,单位时间进入Camera的光通量就越大,弱光环境下,拍 照效果就越好,但同理景深就越浅,同时边缘画质和主体锐度就较差
4)像圆径:image circle
圆光学系统所成像的最大直径圆。取决或决定于配合使用 Sensor尺寸。
5)镜头总高:total track length
光学总长是指由镜头中镜片的第一面到像面的距离。
6)后焦距:back flage length
光学后焦:最后一片镜头中心到成像面的距离
机械后焦:底端面到成像面的距离
7)相对照度
画面角落与中心的亮度比
8)主光线角度:chief ray angle (与sensor不匹配,会产生暗角偏色)
9)TV畸变:TV distortion
2.1.2 IR Filter红外滤镜
功能:除去红外光,避免红外线干扰,修正进来的光线,改善sensor 邻近干扰,使影像呈现的色彩符合人眼的感觉 。
分类:一般分为干涉式的IR/AR-CUT(在低通滤波晶片上镀膜,利用干涉相消的原理)和吸收式的玻璃(利用光谱吸收的原理) 。
影响因素:针对IR-CUT,与IR-CUT厚度无关,主要在于镀膜工艺控制和镀膜层数针对玻璃,与厚度相关,越厚越好,另外针对高端的还有一种蓝玻璃IRCF
针对手机Camera: 1)对可见光光谱段:430-620nm有透过率要求,Tmin>=85% 2)对滤除波段:650+/-10nm有滤除要求,T<=50% 3) 对近红外光谱段:700-1200nm有透过率要求 4)AR面的对可见光的420-670nm有反射率要求
2.1.3 Sensor
Sensor分类按感光元件一般可分为CCD和CMOS
Sensor的工作原理
其实传感器Sensor中感光的部分是由许个像素按照一定规律排列 的。
光照--〉电荷--〉弱电流--〉RGB数字信号波形--〉YUV数字信号信号
2.2 数据输出
2.2.1 输出格式
CMOS模组输出信号可以是模拟信号输出和数字信号输出。
模拟信号一般是电视信号输出,PAL和NTSC都有,直接连到电视看的;
数字输出一般会有并行和串行两种形式,由于图像尺寸大小不同,所要传输的数据不同,数据的频率差异也很大,但是串行接口的pixel clock频率都要比并行方式高(同样的数据量下这不难理解),较高的频率对外围电路也有较高的要求;
并行方式的频率就会相对低很多,但是它需要更多引脚连线;所以这应该是各有裨益。
2.2.2 ISP
一般CMOS Sensor模组会集成ISP在模组内部,其输出格式可以选择,这样可以根据自己使用的芯片的接口做出较适合自己系统的选择。其中,部分sensor为了降低成本或者技术问题,sensor部分不带ISP或者功能很简单,输出的是BAYER PATTERN,这种格式是sensor的原始图像,因此需要后期做处理,这需要有专门的图像处理器或者连接的通用处理器有较强的运算能力(需要运行图像处理算法)。
2.2.3 行场同步信号
一般都有三个同步信号输出:帧同步/场同步(Frame synchronizing)、行同步(Horizontal synchronizing)和像素时钟(pixel clock)。要保证信号的有效状态与自己系统一致,如都是场同步上升(下降)沿触发、行同步高(低)电平有效等。
3.硬件设计与接口定义
对于摄像头的硬件接口
在君正的开发板上,接口定义如上图所示。
Signal |
I/O |
Description |
---|---|---|
HREF |
I |
行同步信号 |
PCLK |
I |
像素时钟 |
DATA[7:0] |
I |
像素数据 |
SCCB |
I/O |
sccb通信 |
MCLK |
O |
系统时钟信号 |
控制逻辑为摄像头上电、IIC控制接口。
数据输出为摄像头拍摄的图传到主控芯片,所有要有data、行场同步和时钟号。CMOS接口的图像传感器芯片可以感知外部的视觉信号并将其转换为数字信号并输出。
我们需要通过MCLK给摄像头提供时钟,RESET是复位线,PWDN在摄像头工作时应该始终为低。PCLK是像素时钟,HREF是行参考信号,VSYNC是场同步信号。一旦给摄像头提供了时钟,并且复位摄像头,摄像头就开始工作了,通过HREF,VSYNC和PCLK同步传输数字图像信号。 数据是通过D0~D7这八根数据线并行送出的。
这里需要注意,在调试摄像头之前,一定需要通过MCLK提高时钟,否则摄像头不能正常工作,通信接连接不上。
3.1 上下电时序
这个要接规格书上来,注间PWDN、RESETB这两个脚,不同的摄像头不太一样,这个图是上电时序,上电时参考一下,知道在那里看就行
严格的来说,应该是按照这个时序来进行设计。先进行摄像头上电,然后输出MCLK到摄像头模块,接着PWDN,最后RESET一下摄像头。目前来看,这个过程的时序要求不是十分的严格。但是PWDN后是否需要RESET,这有什么影响目前还不确定。
3.2 PCLK \D1~D7
对于数据的传输,需要关注的信号主要是PCLK与D1~D7信号
PCLK是像素时钟,可通过设置寄存器的值来进行PCLK的配置。
首先输入时钟MCLK如果为24MHz。
所以如果需要设置PCLK也为24M,可以通过设置0x11寄存器为0x01来设置
/* CLK */
{0x11, 0x01}, //时钟频率CLK [5:0]
{0x36, 0x3f},
此时可以计算出一帧数据的时间。
通过计算,如果按照YUV图像格式接收数据,图像为VGA,频率为24MHz,那么一帧数据的时间约为33ms。
3.3 Camera Interface Module (CIM)
摄像头的采集的数据CPU无法直接处理,主控芯片X1000里面集成了Camera控制器,叫CIM(Camera Interface Module)。摄像头需要先把图像数据传给控制器,经过控制器处理(裁剪拉升后直接预览或者编码)之后交给CPU处理。实际上摄像头工作需要的时钟(MCLK)也是CIM给它提供的。
在君正x1000上的摄像头接口可支持CMOS 或者CCD类型的摄像头, CIM可直接连接外部的摄像头模块。
在接口引脚方面,主要是下面几个引脚
Name |
I/O |
Width |
Description |
---|---|---|---|
MCLK |
O |
1 |
CIM输出时钟 |
PCLK |
I |
1 |
像素时钟 |
VSYNC |
I |
1 |
垂直同步信号 |
HSYNC |
I |
1 |
水平同步信号 |
DATA |
I |
8 |
数据 |
通过CAM_MCLK给摄像头提供时钟,RST是复位线,PWDN在摄像头工作时应该始终为低。HREF是行参考信号,PCLK是像素时钟,VSYNC是场同步信号。一旦给摄像头提供了时钟,并且复位摄像头,摄像头就开始工作了,通过HREF,PCLK和VSYNC同步传输数字图像信号。数据是通过DATA0~DATA7这八根数据线并行送出的。
在行场同步信号中,可收集图像的帧同步信号来判断采样点,同时内部可通过设置设置一帧图像对的大小来进行一帧图像是否完整的判断。
4.驱动与调试
由于本文主要是针对摄像头OV7740来进行主要的分析,同时也对OV7725进行一些探索。所以总结出摄像头驱动编写的一般流程与思路。同时在君正x1000上如何使用好摄像头模块进行详细的分析。
根据以往调试Camera驱动,总结的一些小经验:
1.首先对照电路图,检查Camera的电路连接是否正确;
2.用万用表量Camera的电源管脚,查看Camera的供电是否正常,确定是否需要我们在程序中进行电源控制;
3.查看Camera的Spec文档,检查PWDN和RESET的管脚触发是否正常,是否需要在程序中进行控制;
4.在Camera的Datasheet中找出该设备的I2C地址,检查I2C地址配置是否正确;
5.查看I2C通信是否正常,是否能正常进行读写,用示波器量出I2C的SCL和SDA的波形是否正常,未通信时都为高电平,通信时SCL为I2C时钟信号,SDA为I2C数据通路信号;
6.用示波器量Camera的MCLK管脚,看是否正确,如果MCLK正常,通常情况下PCLK也应该有波形;
7.检查Camera的初始化寄存器列表的配置是否正确。
这几步是很重要的,因为摄像头是一个不可看见状态的设备,所以在调试前期,一定要检查电路的连接是否正常。如果硬件上出现问题,后面调试起来会走很多的弯路,也会浪费大量的时间与精力。
4.1 Sensor 的初始化步骤
一般 sensor 的初始化通常包含以下几个步骤
1.sensor上电,电源分为模拟电压,数字电压,IO电压。这三个电源并没有严格的先后上电顺序,可以在代码中同时打开
2.对 sensor 输出 MCLK,配置对 PCLK 采样输出频率,这是能否正常接收 sensor 数据的关键。
3.配置 V, H 同步信号的输出极性,如果极性配置不对,将造成图象不能正常采集,自然显示混乱。
4.硬件的 reset。sensor 的 reset 为低 reset,并且至少持续 1US。
5.软件的 reset。 既然为软件的 reset,那就必须要求 X1000够对 sensor 进行写寄存器。也就是要保证 IIC 能够正常地写数据进入 sensor ISP,这点是保证软件能够进行调试的基础。软件 reset 通常根据 sensor 的不同会有所变化,注意硬件 reset 后要保留一些时间才能使用 IIC 总线。通常在 10 个 US 以上 。
6.OV7740或者OV7725在 ISP 中默认了一组寄存器,能够在 reset 后不用 IIC 写任何寄存器就能输出图象,这个时候 sensor 的 input clock 是 output clock 的两倍,前期可以用这个方法来验证硬件和软件供电,复位等是否正确,当后端接受的图象 engine只能用 mclk 来同步工作时候,必须要正确配置接收的采样频率 。
7.初始化寄存器,并配置输出频率和输出图象的分辨率 。
8.读取 sensor 的版本号,如果与我们所用产品的 version 一致,就代表初始化工作正确完成 。
4.1.1 I2C与SCCB总线协议
I2C串行总线有两根信号线:一根双向的数据线SDA;另一根是时钟线SCL。所有接到I2C总线上的设备的串行数据都接到总线的SDA线,各设备的时钟线SCL接到总线的SCL。在I2C总线传输过程中,将两种特定的情况定义为开始和停止条件,当SCL保持“高”, SDA由“高”变为“低”时为开始条件; SCL保持“高”, SDA由“低”变为“高”是为停止条件。开始和停止条件由主控器产生。使用硬件接口可以很容易地检测开始和停止条件,没有这种接口的微机必须以每时钟周期至少两次对SDA取样以使检测这种变化 。
在调试ov7725摄像头时,首先遇到的是ov7725摄像头的I2C通信不能正常的通信的问题。在ov7725摄像头和GC2155摄像头上都可以正常的运行,可是同样的程序在ov7725上就不能正常的运行了。其实这个是由于ov7725的摄像头协议比较的严格,不兼容标准的i2c协议,而ov7725与gc2155摄像头是兼容i2c协议的。
SCCB的写数据
I2C写数据
其实在写数据协议这一块两者是没有差别的,主要的问题就是对于OV7740和GC2155写数据的方式可以通过下面的方式进行寄存器数据的写
首先写设备ID,然后写摄像头寄存器的地址:
接着写摄像头的ID,然后写像头寄存器的数据:
而这种方式对于OV7725操作是不行的,所以OV7725对协议的要求还是比较严格的。
SCCB的读数据协议
首先写寄存器的地址Sub-address
然后开始读数据
I2C的读数据协议
其实这里的最大问题就是发送了寄存器地址后,需要加一个停止位,然后从新开始发送设备地址,读取数据。
对于ov7725而言,只能使用SCCB协议,而OV7740与GC2155是支持I2C数据协议的。
4.2 摄像头问题及解决办法汇总
4.2.1 名称解释
白平衡
白平衡指的是传感器对在光线不断变化环境下的色彩准确重现的能力表示。大多数拍照系统具有自动白平衡的功能,从而能在光线条件变化下自动改变白平衡值。设计工程师寻找的图像传感器应该配备了一个很好的自动白平衡(AWB)控制,从而提供正确的色彩重现。要说到白平衡就要先建立色温的概念其实在摄影领域,光源大多是根据它们的色温来定义。色温的单位是开尔文,在不同温度下呈现出的色彩就是色温。 当一个黑色物体受热后便 开始发光,它会先变成暗红色,随着温度的继续升高会变成黄色,然后变成白色,最后就会变成蓝色(大家可以观察一下灯泡中的灯丝,不过由于受到温度的限制,大家一般不会看到它变成蓝色)。总之,这种现象在日常生活中是非常普遍的。
人的大脑能仔细分析出从眼睛接受的信号,因而能感知不同的色温(colortemperature)来显示相同的白色。但 camera 却不能,在早晨时分的相片偏红,而黄昏时候的却偏黄,就算同一张白纸在不同的环境下被拍摄, 如不同的时间,不同的光源,都会出现不同程度的偏差。调整白平衡,就是要给白色一个定义,能正确记录我们眼睛所看到的颜色。 sensor 给出了两种白平衡的控制方法,一种是自动白平衡(AWB),一种是手动白平衡(MWB)。自动白平衡为 sensor 内部 ISP 的默认设置, ISP 中有一结构复杂的矩形图,它可决定画面中的白平衡基准点,以此来达到白平衡调校。由于手机 camera 不属于色彩要求很高的照相机范畴,所以我们一般使用自动白平衡,自动白平衡在光源不是特别复杂的时候有较好的效果。手动白平衡需要自己设置 R, G, B 的 gain 值, 寄存器中有专门设置这三个值的寄存器 。
动态范围
动态范围测量了图像传感器在同一张照片中同时捕获光明和黑暗物体的能力,通常定义为最亮信号与最暗信号(噪声门槛级别)比值的对数,通常用54dB来作为商业 图像传感器的通用指标。具有较宽动态范围的 图像传感器可以在明光环境下提供更好的性能(例如,使用较窄动态范围传感器在明光环境下拍出的照片会出现“水洗”或模糊的现象。)
图1--摄像头在逆光时,整体入光量太大(窗外光线太强了),为避免过曝就导致背景正常了,但主体却曝光不足因此就黑掉了
图2—就是动态范围比较好,把主体跟背景都能曝光正常.
工频干扰
如果手机出现水波纹就是工频干扰。工频干扰是由于室内日光灯闪烁造成的。 CMOS 与 CCD 两种不同的工艺制造出来的 sensor 工频干扰现象是不一样的,这是由暴光的方式不同造成的。
Sensor在日光灯作为光源下获取图像数据时会产生flicker,其根本原因是照在不同pixel上光能量不同产生的,所接受的光能量的 不同也就是图像的亮度的不同。 由于CMOS sensor的曝光方式是一行一行的方式进行的,任何一个pixel的曝光时间是一样的,也就是同一行上的每个pixel的曝光开始点和曝光的时间都是一模一样的,所以同一行的所有点所接收到的能量是一样的,而在不同行之间虽然曝光时间都是一样的,但是曝光的开始点是不同的,所以不同行之间所接受到的能量是不一定相同的。 为了使不同行之间所接受的能量相同,就必须找一个特定的条件,使得每一行即使曝光开始点不同,但是所接受的光能量是相同的,这样就避开了flicker,这个特定的条件就是曝光时间必须是光能量周期的整数倍时间。 Banding由工频干扰引起,交流电光源都有光强的波动,在中国交流电频率是50Hz,光强的波动就是100Hz,周期10ms。如果camera曝光时间不是10ms的整数倍,那么在不同的感光面接收到的光能量一定不一样,体现在图像上就是有明暗条纹。 消除banding就得想办让曝光时间是10ms的整数倍!60Hz的交流电需要控制曝光时间为8.33ms的整数倍。
以50Hz为例说明,实现这个有两种办法: 1、设置曝光控制,强制为10ms整数倍变化,但是这样会浪费一部分曝光时间,导致曝光无法用满,在室内自然就会损失性能。
2、修改桢率,使每桢图像分到的时间是10ms的整数倍,则可以用满每桢曝光时间在,室内效果更好。修改桢率可以插入Dummy Line或者Dummy Pixel。这需要一点点计算,具体计算需要看sensor输出Timing。 例如把桢率设置为7.14fps,则每桢曝光时间是140ms。如果是15fps,则每桢曝光时间是66.66ms,如果强制曝光为10ms整数倍,最大即60ms,则有6.66ms无法参与曝光,损失性能。 具体调整桢率方法得和sensor的FAE沟通,每个sensor都可能不一样,不能一概而论。调整桢率还有个原则要注意,预览一般不能低于 10fps,再低就很卡,常用14.3fps和12.5fps;抓拍不能低于5fps,否则用手就很难拍出清晰的照片,常用7.14fps。桢率是一个权 衡折中 的选择,高了曝光时间不够,暗光效果太差,低了没法拍照,容易虚。
IR cut (滤除红外光)
sensor不仅对可见光谱感光,而且对红外光谱感光. IR就是infrared红外光, 如果没有IR-Cut Filter,图象就会明显偏红,这种色差是没法来用软件来调整的,一般IR-Cut在650+/-10nm,而UV,紫外光的能量很小,一般就忽略了.未加IR cut 拍摄的照片,可见影响最大的是图像的色彩.+
Binning
Binning是将相邻的像元中感应的电荷被加在一起,以一个像素的模式读出。Binning分为水平方向Binning和垂直方向 Binning,水平方向Binning是将相邻的行的电荷加在一起读出,而垂直方向Binning是将相邻的列的电荷加在一起读出,Binning这一 技术的优点是能将几个像素联合起来作为一个像素使用,提高灵敏度,输出速度,降低分辨率,当行和列;同时采用Binning时,图像的纵横比并不改变,当采用2:2Binning,图像的解析度将减少75%。在手机小屏幕上Preview时建议用这种方式 而不是通过DSP来做抽点的动作。
4.2.2 图像传感器图像问题总汇
出现横向条纹
比如出现横向的紫色或绿色条纹。一般情况下是时序有问题。 走线的时候要注意 MCLK、PCLK还有帧同步(vsync)和行同步(hsync),基本上市面上的芯片这些信号都要分开走线,最好加GND。
现象: 闪横的紫色或绿色干扰线 原因: Hsync和高速线距离太近太长, 产生了耦合(10cm的高速线产生约5pF左右的耦合电容), 导致HSYNC不能迅速拉升至90%的区域,相位不同步,最终数据采集有错位。然后因为YUV算法的作用,引起绿线和紫色的闪线。)
解决办法:绝对禁止将HSYNC,PCLK,MCLK这三根线挤在一起走线。
1)HSYNC夹在低速线SDA和SCL之间
2)PCLK和MCLK如果一定要贴着走线,最好拉开一点距离,当中夹一根地线。
颜色和亮度不连续
一般是数据线存在短路、断路和连错的问题。图像会出现类似于水波纹的等高线或大面积色偏. D信号丢失画面整体也会色偏,比如RGB565,D0~D4均断路图像会因蓝色和绿色信号丢失过多而呈现红色。
1)一根数据线虚焊导致的等高线及颜色失真
2)两根数据线和其他设备复用导致的偏绿问题
3)数据线接反的情况
4)数据线错位
图像中只有红或绿颜色
Y和U/V的顺序不对。将摄像头的采样格式由CbYCrY改为YCbYCr后,颜色就对了。
模拟电压过低或不稳定
模拟电压过低导致很强的光才能感应图像,并且偏色。
只有天花板上的灯管才感应成像,其他部分很模糊。
模拟电压过低导致竖向条纹。提高AVDD后问题解决。
在调试 OV7725时发现,刚打开摄像头时图像有条纹,开了一段时间后图像就正常了,有没有哪位知道是什么原因;不正常的图像如下。查出问题了,是模拟电压不稳导致的。
背部材料太薄导致“鬼影”
补强的表面要用亚光黑油,防止漏光。
由噪声导致的图像横纹
将CMOS移到离主IC较远的地方现象就消失了,之前是放在主IC的背面,猜测是主IC对CMOS造成的影响,比如在模拟电压上引入噪声。
cmos为ov的30w像素,型号为ov7141。使用时出项很明显的水平方向的横波纹。 采用3.3v和2.5v供电,其中VDD_C和VDD_A是由2.5v供电,pcb上直接将他们连在一起接2.5v。直接铺地,没有划分模拟地和数字地。 使用外接电源对AVDD供电,没有出现上述现象。可以确定是由主板的电源噪声引起的。
工频干扰
在室外自然光下如果不会出现,那一定是50/60Hz引起的flicker。
Lens校准参数未调好导致的中间较亮的情况
中间较亮
软件上,可能是lens correction没调好(个人感觉楼主状况属此列),设定好correction区域然后将gain值拉高让中心与周边亮度差异减少,如果此时整个画面过曝,可以将整体gain值再往下调(也可以设定曝光参数来减少画面亮度)。
自动曝光计算出现的偏绿现象
在室外光线较亮拍摄时,画面颜色任何时候都正常。在室内光线较暗拍摄时,刚打开摄像时拍摄的画面偏绿,几秒钟之后就会恢复正常。属于正常现象。OV7670 30W 计算AE时间比较长。在计算AE的过程中容易出现偏色现象。 可以丢帧或者延时解决这个问题。
时序不对导致的图像上部或下部出现条纹
camera 模组的timing调整不了。修改AP的camera控制,使垂直同步偏移12 rows. 图像输出正确。
lens镜间反射导致的眩光
这是一颗5M的模组拍摄的图片,天花板的灯在视场外边缘,图中为何出现紫红色的光?是什么原因造成的?
属眩光现象,一般是由于多片lens镜间反射造成。通过改善镀膜制程,增加镜片透射率可以缓解次问题。 另外,这张照片光心偏到左边去了,holder偏移?lens set circle够大啊,这种偏移都能cover掉。
pclk与vsync布线干扰
在调试一款手机摄像头(OV7675)时,发现画面垂直不同步,主要是画面的下半部分跳动很厉害,上半部分是好的. 问题已经找到了,帧同步VSYNC和PCLK布线有干扰
PCLK采样边沿选择不对导致的噪点
转换了一下Pclk的极性,这个躁点的问题得到了很好的解决。 例2. ov7675拍出来的照片发绿。可能是PCLK采样边缘不对,可以试试将pclk反向。也可能是数据线缺失问题。 例3, 如下图所示。通过修改pclk的上升沿和下降沿就解决了。 主要有两点: 1.修改PCLK的上升沿的斜率。 2.或者修改I/O的上升沿的斜率
原因是不同厂家的模组layout的走线的长短,FPC的厚薄,都可能影响到PCLK的获取, FPC的公差过大,或者头板的制作是否有什么问题,都可能引起这个问题。 如果可以通过硬件的方式改变PCLK上升沿的斜率,也可以解决这个问题。 通过修改pclk的上升沿和下降沿就解决了
FPN问题
白天或亮一点的地方是没有这个问题,就只有在低照度下使用闪光灯拍照会有这样的情形。 FPN( fixed pattern noise), 无解。
台阶效应
gain过大,把digitalize的量化步距,乘大了,就出现台阶效应。还与内部的量化精度不够,有关系。 另外,若不同的颜色通道的gain不同(白平衡计算出的R/G/B_gain不同),会出现color phase error。 只画了B、G两个通道,B_gain比G_gain大,会造成灰阶的景物,有的地方B大,有的地方G大,就会出现颜色不断交替。
因电源问题产生的竖向条纹
现在已经确定是电源的问题了,我在每个电源都并上了一个大电容,条纹消失了。现在我是用CPU的I/O采集的,效果很好。
Lens与摄像头不匹配导致的部分偏红现象
图中下方居中的地方偏红。ov工程师将LENS CORRECTION调到了极限问题还存在,确认是LENS与SENSOR不匹配造成的,模组厂家更换了镜头后问题基本解决。
1.首先你的照片awb就不对,本身这张照片就没有达到白平衡.
2.照片边界锯齿现象很严重. 3. 色偏问题,你首先要了解一下你的sensor的Lenschief ray angle角度是多少,还有lens的CRA是多少.如果lens的CRA小于sensor的.一定会有偏色的现象.要么换lens.如果市场上找不合适 的Lens,就说明sensor 本身品质不是很好. 4.理论上lens shading是解决lens的通透率不一样的问题.但也许各家回加自己的算法,可以一试. 5.如果Lens 和sensor都已经固定,可以人为想一些办法来减少色差. a.可以将颜色调淡点,这样就不太明显 b.做AWB校正,排除不同sensor对RGB感应的不同,引起AWB曲线走的不准. CRA通俗的讲是lens的主轴光线和对成像有贡献的最大的如射光线的夹角,一般Lens厂商会提供CRA曲线,因为Lens从中心到四周的CRA是不一样的.9 f% N8 u2 L1 u9 K7 ?8 ]2 F# Y 偏红除了SHADING外可能还是要调AWB,因为图片的下方其实就是一片白色,sensor在照白色的地方出现了偏红,再试试调整一下AWB,或者在灯箱里看看R,G,B的三条线是否重合! 如果是AWB的问题,那为什么图像还有白色区域呢?AWB是不会调的有的偏色,有的不偏,不知道的就不要乱说。 如果是CRA不比配,那出现的偏色应该是对称的,下面偏紅则上面一定会偏紅。 个人觉得应该是漏光造成的,不是barrel就是通光孔那里引入了杂光。
DOVDD28走线过细过长以及地线不合理
现象:花屏
原因:2.8V电压因为导线上的电阻吸收了电压,导致驱动能力不够。地线被拉高并产生毛刺现象,影响信号完整性和数据采集。
DVDD电压有问题
图中的高光部分是办公室窗户。其它部分全黑,没有任何细节? 是什么原因?AWB?AGC?还是对比度啊? 问题解决了,是DVDD电压不对。 datasheet写的1.8V,问了FAE结果是1.2V。
增益小导致的白色条纹问题
当对着白色的物体时,刚进入预览时,会出现下图中显示的条纹,当移动手机时,则这种条纹消失,以后也不会出现,只有再次进入预览时可能会出现,请教各位大虾到底是什么原因? 这个问题,现在已经解决了,加大了初始化代码中的增益之后,就可以了。
帧率问题导致的图像错位
Sensor为0v9655 在拍sxga 130万图像有时会出现图像错位的问题(如图),vga的则不会出现,帮忙分析。谢谢! 帧率太高了,暴光时间短了.可以调整VBLANK,HBLANK来解决 再降低FPS到5,试试,你的buffer速度呢?? 谢谢大家!在我这里降低帧速率比较有效。
电源噪声
OV9653出现如图所示的横向纹路。 问题已经解决,电源问题,AVDD加钽电容就好了。估计是电源纹波比较严重导致的。
图像中有不断变化的细密的水平条纹
与荧光灯的频闪造成的大面积的滚动水平条纹不同,表现出来的是一个像素高的水平条纹状躁点,位置不固定,数量比较多,而且随光线强弱有一定的变化。
因为设置某些sensor寄存器的时候,会影响到这些水平条纹的颜色,所以基本上排除是在数据传输过程中板子对数据造成的干扰,也排除接触不良的可能性,应该是数据在sensor内部已经存在这些水平条纹。此外相同的初始化序列,相同的sensor,在厂商的demo版上也没有发生这种情况,所以也基本排除软件的问题。 最后,发现原先为了节省硬件成本,将sensor的两个电压相同的模拟电和数字电由同一芯片输出供给,导致两者之间互相干扰,影响了sensor的正常工作。
解决办法
将模拟电和数字电分离单独供电
图像上有固定的锯齿状垂直条纹
图像上有明显的垂直条纹,全屏分布,非常细密,好像百叶窗一样。
仔细看可以发觉该垂直条纹实际上是由于图像上相邻的两两像素互相错位造成的锯齿状条纹6 仔细分析spec可以看到,由于sensor是按字节送出图像数据,在RGB565模式下,两个字节表示一个像素。而在我所使用的CPU的Camera控制器中,数据是按4个字节也就是一个字为单位处理的,由于CPU这端是按LSB方式处理数据的,所以在一个字内部,未经调整的话,两个像素的顺序是颠倒过来的。也就是最终由DMA将数据送到内存的连续buffer中时,像素的顺序是:像素2,像素1,像素4,像素3。。。
解决办法
用程序调整像素顺序,为了减少附加计算对CPU的负担,可以将这一步操作合并在其它类似颜色转换或PACK模式转Planer模式等操作中。
大尺寸时容易出现图像错位
当sensor工作在最大分辨率的情况下时,图像容易出现上下错位的现象。
跟踪程序可以看到这时候CPU的Camera控制器的FIFO缓存发生了溢出现象,也就是说DMA来不及将FIFO中的数据传送到内存中,该例中sensor在最大分辨率的情况下,输出数据的时钟工作在24MHZ,理论上说,DMA应该是来得急传送数据的,但是可能因为内存带宽还会被其它设备如CPU占用,导致来不及写入内存,使得DMA没有最大负荷的工作,所以来不及将FIFO中的数据读出,导致部分数据丢失,图像错位。
解决办法
某些情况下,改变DMA传输的启动阙值可以解决该问题,但是有些情况是无效的 考虑到最高分辨率仅在拍照的时候使用,预览的时候并不使用该分辨率,所以,在不影响预览桢数的情况下,可以在拍照的一瞬间改变分辨率的同时,修改sensor的时钟频率,降低到一个不会导致FIFO溢出的频率, 另外,在截获最高分辨率的图像的同时,尽量不执行其它的内存相关操作。截获完图像马上切换回预览用的分辨率。通过这些办法,减少发生FIFO溢出的可能性。
读取到的数据显示出来的时候是花屏
读取到的数据显示出来的时候是花屏,但是明显是随着所拍摄的对象的变化而变化的。
显示的数据是完全的花屏,或者可以看出物体大致轮廓,但颜色完全不对,例如一片绿色。这种情况往往是因为图像数据格式不匹配,例如没有处理YUV2RGB,YUV的各个分量采样顺序与软件计算的取值顺序不匹配等。
如果花屏的具体表现是图像不断变换,没有规律,通常有可能是数据接收的触发边沿有误,导致没有正确的接收数据。
另外有一次,花屏的时候,仔细观察花屏的图案,发现有部分错位重复的图案的迹象。因此分析可能是Sensor的物理layout,其长宽比例与LCD刚好相反,仔细查看Spec得到确认。
图像干扰问题
原因可能是:
(1)、摄像头模组有问题,换一个摄像头试一下;
(2)、数据线驱动能力不足,这个可以在摄像头寄存器里面改,问下摄像头模组FAE,看改那些地方;
(3)、两个摄像头共用数据线时,不工作的摄像头会把工作的数据信号减弱;
(4)、PCB 走线太长,也会有干扰,不过我觉得这个可能性小,调试好就一款这样的的,模组厂FAE说的,不过他们模组本身也有问题,两方面因素都有吧:PCB(线过长)、模组打样也有问题。
YUV顺序不对
yuv顺序不对时,出现如下现象。
看下摄像头规格书,把相应寄存器的值改一下就可以了。如下以红框里是不同yuv顺序,找到改为相应的。
杂光,鬼影
其行业的专业术语统称为Flare,是指在拍摄光源或者强光物体时,边缘出现光影或出现一个完整物体的影子,而且这种现象只能减轻不能完全消失,原因是由于镜片的材质导致光线不但存在折射还存在反射,整机由于镜头面到保护镜片距离很大会更明显!
采用频率不匹配
必须要正确配置接收的采样频率,否则不能得出正确的图象。
上图就是采样频率不匹配的现象。请注意与 YUV, RGB 顺序配置错误的现象有什么区 别。下图是顺序倒置:
亮度以及夜景模式
相信现在大家都知道图象的亮度与暴光时间相关,所以为了让暗处的图片能够清晰地显示必须增加 sensor 对暗处图象的暴光时间, 也就是 line time 会设置得比普通模式的时候要大许多,这样能使 CMOS sensor 拥有更多的暴光时间,从而提高亮度 。
上图为没有采用夜景模式的照片,下图为使用夜景模式的照片
我们有两种方法来控制图像亮度,一种是使用 AE target,一种是加大灰度增益。我们使用的是 AE target 方式,这样的图片色彩更逼真。用这种办法会影响到 frame rate,当帧率达到我们限制的极限的时候,就要用增加模拟增益来做了,这样会同时放大图像噪声。一般不用增加数字放大增益来调整图像亮度。
5. 总结
本文主要从一些基本的概率出发介绍了摄像头工作的原理及一些调试的经验。这些资料对于后期问题的分析有一些参考价值。其中很多的调试经验自己也犯过很多的错误,所以将这些经验无论是别人遇到的,还是自己遇到的,都进行一下记录。
本文的目的不是针对某一个具体的摄像头和MCU而言,只是在自己的开发过程中对一些问题的思考以及对网上资料的收集与整理。所以不涉及到很多程序部分的逻辑。对问题和概念分析的比较多。
参考链接: