1. camera基本原理
1.光线通过镜头Lens进入摄像头内部
2.图像传感器转换光信息为电信息
3.原始的RAWData经过ISP转换成RGB/YUV数据
4. 应用层处理压缩变成常见的图片或者视频
Sensor输出格式是否RAW
可分为带ISP sensor和不带ISP的sensor,市面上大部分sensor都是不带ISP的,Raw不能直接显示,必须经isp过处理才能正常显示。某些SOC不带isp就需要选用sensor内部带isp的sensor
2. RAW图像格式
Raw图记录的就是CMOS或者CCD图像传感器将捕捉到的光源(光子)信号转化为数字信号的原始数据
感光阵列(Sensor)接受光子示意图:其中黄色小圆球代表光子大小,下面为光电转换矩阵
此处引入一个衡量电信号强度大小的概念——“比特深度(bit depth)”,比如一个16bit的模组意味着65536的灰度范围,8bit模组即表示2的8次幂即256(raw8、raw10、raw12、raw16)
Raw是光电转换的结果,其无非就是一个灰度信号记录器。我们知道光由RGB三种基色组成,那么问题来了:怎样区分每个像素对于每个颜色通道(R channel, G channel, B channel)获取的量的多少?
为了获取各通道颜色分量,可以考虑给每个像素上面叠放一个颜色过滤器,即每个像素可以让相应的颜色分量通过,而丢弃掉不需要的颜色分量,如右图所示:
但每个像素点需要对于丢弃的颜色分量进行“估计”,以完成单像素点全部颜色分量的构建,构建算法在后面会有介绍。
已有的典型颜色Pattern很多,如:RGBE filter,CYGM filter,Bayer filter等,其中工业界应用比较多的是Bayer滤波器。
典型的Bayer矩阵如右所示:
绿色明显多于红色和蓝色,这是因为BAYER矩阵实际上仿照了人眼对于绿色比较敏感的特点,绿色比红色和蓝色多会进一步降低噪声并可以让图像有更好的细节呈现
为了获取各通道颜色分量,可以考虑给每个像素上面叠放一个颜色过滤器,即每个像素可以让相应的颜色分量通过,而丢弃掉不需要的颜色分量,如右图所示:
但每个像素点需要对于丢弃的颜色分量进行“估计”,以完成单像素点全部颜色分量的构建,构建算法在后面会有介绍。
已有的典型颜色Pattern很多,如:RGBE filter,CYGM filter,Bayer filter等,其中工业界应用比较多的是Bayer滤波器。
典型的Bayer矩阵如右所示:
绿色明显多于红色和蓝色,这是因为BAYER矩阵实际上仿照了人眼对于绿色比较敏感的特点,绿色比红色和蓝色多会进一步降低噪声并可以让图像有更好的细节呈现
3. Demosaicing去马赛克
上文提到采用Bayer Pattern之后,每个像素点需要对于丢弃的颜色分量进行“估计”,以完成单像素点全部RGB颜色分量的构建,关于构建的算法称为Demosaicing算法。
Bayer格式插值有插值红蓝算法和插值绿值两种
插值算法容易导致图像出现失真,甚至出现摩尔纹。
去马赛克参考代码:10.0.210.2:/data/gaowj/uapi-app/rawbin2rgb
双线性插值、自适应插值算法图像对比
双线性插值法使图片变模糊,在图片中栅栏区域有大量的拉链效应和伪彩色失真;自适应插值算法拉链效应会好很多,还是有一点异常需要优化
4. raw存储格式
衡量电信号强度大小的概念——“比特深度(bit depth)”,比如一个16bit的模组意味着65536的灰度范围,8bit模组即表示2的8次幂即256(raw8、raw10、raw12、raw16)
raw10、raw12,raw14 ddr中按16bit存储,可以选择低位补零或者高位补零
5. Camera硬件接口
GPIO:
reset复位、PWDN上电、STROBE曝光输出
配置接口:
SCCB、CCI(CSI协议中定义的)、I2C
用于控制和配置图像传感器的参数。它用于发送命令和控制信息,以调整传感器的设置,如曝光时间、增益、白平衡等。关注的是对传感器进行配置和控制的命令和数据,而不是图像本身。
图像物理层接口:
D-PHY、LVDS、DVP(bt565、bt1120)
从传感器捕获的实际图像数据,如像素值、颜色信息等。
6. 逐行曝光
我们先理解一 下Sensor爆光的时序, 有利于我们理解后面的计算。 逐行曝光的sensor只有一 行ADC,所以噪光顺序保证ADC不被各行同时占用,也就是读出时间不重叠。
7. 常见参数计算
7.1. 一行时间计算:
line time=line length/pclk
我们这里先介绍几个变量的定义
PCLK:是控制像素输出的适中,表示单位时间内输出的pixel数量
linelength:一行的长度(包含HBLANK),可以理解为包含了hblank一行的像素数
linetime:就是噪光一行需要的时间
7.2. 曝光时间计算:
exposure_time = exposure_line*line_time
exposure_line:曝光时间一般是以line_time为单位的,exposure_line一般是一个寄存器,用来控制曝光时间是多少倍的line_time
exposure_time:噪光时间
line_time:一行时间
这里一定要理解,sensor是一行一行噪光的,VTS就是两行读出间隔,等于行数*每行AD转换的时间。
7.3. 帧长:
隐含一帧的行数,不占用曝光时间
frame_length = Vsync =Dummy Lines = VTotal = VTS = VSize+VBlank
7.4. 行长:
隐含一行Pixel个数,占用曝光时间
line length s Hsync = Dummy Pixel = HTotal = HTS = HSize+HBlank
7.5. 帧率:
Fps = pclk / (VTS*HTS)
=pclk / (frame_length*line length)
=1 / (frame_length*line time)
这里再说一下单位,pclk一秒内采样像素的个数,单位是HZ,VTS和HTS都是行数和一行像素个数,没有单位,line_time的单位是s。
一般line_time是一个常数,调节帧率一般是通过修改frame_length来实现
8. CSI输出帧结构
像素阵列 Pixel Array
特殊用法:调整X_ADDR_START或者Y_ADDR_START可以变换RAW格式:
COL+1:
BGGR->GBRG
ROW+1:
BGGR->GRBG
COL+1; ROW+1
BGGR->RGGB