1. ISP Pipeline概览:RK ISP整体架构、数据流走向、关键模块介绍(AWB/AEC/AF/3A)

各位同学,欢迎来到瑞芯微ISP调试实战的第一课。

咱们直接开门见山。ISP是什么?说白了,就是让摄像头「看」得更清楚的一套硬件+算法系统。你想想看,CMOS传感器出来的原始数据,那叫一个惨不忍睹——偏色、噪点多、亮度不均。ISP就是负责把这些「毛坯房」装修成「精装房」。

我在RK平台上摸爬滚打了好几年,踩过的坑比吃过的盐还多。今天这第一课,咱们先把ISP的整体脉络理清楚。你只有知道数据怎么流、每个模块干什么活,后面调试的时候才不会抓瞎。

1.1 RK ISP整体架构

先看一张我手绘的架构图,这是RK ISP的核心数据流。

RK ISP Pipeline 数据流架构 CMOS Sensor RAW ISP 输入 预处理 DPC/BLC/LSC 核心处理 AWB/AEC/AF Demosaic/CCM Gamma/Sharpen YUV 3A 统计反馈 (Stats) 关键模块说明 ● CMOS Sensor:原始数据源,输出Bayer RAW ● 预处理:坏点校正(DPC)、黑电平校正(BLC)、镜头阴影校正(LSC) ● 核心处理:AWB/AEC/AF、去马赛克、色彩校正、Gamma、锐化 ● 输出:YUV格式,供编码器或显示使用 ● 3A反馈:Stats数据回传给3A算法,形成闭环控制

这张图我建议你保存下来。每次调试遇到问题,先回来看看数据流走到哪一步了,问题往往就出在某个模块的边界上。

1.2 数据流走向

数据从传感器出来,一路经过ISP,最后变成YUV。这个流程我拆成几个关键阶段来讲。

1.2.1 传感器输出:RAW数据

CMOS传感器输出的原始数据,叫Bayer RAW。每个像素只记录一种颜色——R、G、B中的一种。为什么?因为传感器上的滤光片就是按Bayer模式排列的。我刚开始接触时也觉得奇怪,一个像素只有一种颜色,那彩色图像怎么来的?别急,后面有Demosaic模块来插值。

1.2.2 预处理阶段

RAW数据进来,先做三件事:

  • DPC(坏点校正):传感器上总有那么几个像素是坏的,要么一直亮要么一直暗。DPC就是把这些坏点找出来,用周围像素的值替换掉。我在项目中遇到过一批传感器,坏点特别多,DPC参数没调好,画面上一堆白点,后来把阈值设低了一点才搞定。
  • BLC(黑电平校正):传感器在完全黑暗的情况下,输出值不是0,而是一个固定的偏移量。BLC就是把这个偏移减掉。嗯,这里要注意,不同增益下BLC值会变,不能用一个固定值。
  • LSC(镜头阴影校正):镜头边缘进光量比中心少,导致画面四周偏暗。LSC就是给边缘像素乘一个增益系数,让亮度均匀。这个系数跟镜头型号强相关,换镜头必须重新标定。

1.2.3 核心处理阶段

预处理完的数据,进入核心处理管线。这里模块很多,我挑几个最重要的说:

  • Demosaic(去马赛克):把Bayer RAW插值成完整的RGB图像。说白了,就是根据周围像素猜出每个像素缺失的两种颜色。算法好坏直接影响画面细节和伪色。
  • AWB(自动白平衡):让白色物体在任何光源下都显示为白色。人眼会自动适应色温,但摄像头不会。AWB就是通过调整R/G/B增益,把色温校正过来。
  • AEC(自动曝光控制):根据场景亮度,自动调整曝光时间、增益、光圈。太暗了就增加曝光,太亮了就减少。我调试时经常遇到AEC来回跳的问题,后来发现是统计窗口没设对。
  • AF(自动对焦):通过移动镜头位置,让画面最清晰。AF算法会计算对比度,找到对比度最大的位置就是合焦点。
  • CCM(色彩校正矩阵):把传感器捕捉到的颜色映射到标准色彩空间。不同传感器对颜色的敏感度不一样,CCM就是做这个映射的。
  • Gamma校正:人眼对暗部细节更敏感,Gamma校正就是把暗部拉开、亮部压缩,让画面看起来更自然。
  • Sharpen(锐化):增强边缘对比度,让画面看起来更清晰。但锐化过头了会有光晕,这个要小心。

1.3 3A模块详解

3A是ISP的灵魂——AWB、AEC、AF。这三个模块协同工作,决定了画面的基础质量。

核心观点: 3A不是各自为战,而是相互影响的。AEC改变亮度,会影响AWB的色温判断;AF合焦后,AEC的统计值也会变。调试时一定要联动考虑。

1.3.1 AWB(自动白平衡)

AWB的核心是估计当前场景的色温,然后调整R/G/B通道的增益。常用的方法有:

  • 灰度世界法:假设场景中所有颜色的平均值是灰色。如果偏红,就降低R增益。这个方法简单,但遇到大面积单色场景就翻车。
  • 完美反射法:假设场景中最亮的点应该是白色。找到最亮点,用它来估计色温。这个方法在室内灯光下效果不错。
  • 色温曲线法:预先标定不同色温下的R/G和B/G比值,形成一个色温曲线。实时计算当前比值,在曲线上找到对应的色温。

我曾经在一个项目中,AWB在暖色灯光下总是偏黄。查了半天,发现是色温曲线标定的时候,光源色温不准。重新标定后就好了。所以,标定数据一定要靠谱。

1.3.2 AEC(自动曝光控制)

AEC的目标是让画面亮度适中。它控制的参数有三个:

参数 作用 优先级 注意事项
曝光时间 控制传感器感光时长 最高 太长会导致运动模糊
模拟增益 放大传感器信号 中 增益越大,噪点越多
数字增益 数字域放大 低 会放大量化噪声

AEC的策略是:先调曝光时间,时间到上限了再加模拟增益,模拟增益到上限了再加数字增益。为什么?因为曝光时间增加不引入噪声,而增益会放大噪声。这个优先级顺序,我在调试时经常要跟算法团队确认。

1.3.3 AF(自动对焦)

AF有两种主流方式:

  • 对比度检测AF(CDAF):移动镜头,计算每一帧的对比度值。对比度最大的位置就是合焦点。这个方法精度高,但速度慢,因为要来回扫。
  • 相位检测AF(PDAF):传感器上有专门的相位检测像素,可以一次判断出焦点偏移的方向和距离。速度快,但需要硬件支持。

RK平台同时支持CDAF和PDAF。我建议在光线好的时候用PDAF,速度快;暗光下切到CDAF,因为PDAF在暗光下精度会下降。

1.4 3A的协同工作

3A不是三个独立的模块,它们之间有一个统计反馈回路。看上面的架构图,注意那条虚线——Stats数据从ISP输出端反馈回3A算法。

具体流程是这样的:

  1. ISP处理完一帧图像后,生成统计信息(亮度直方图、色温统计、对比度值等)。
  2. 这些Stats数据通过HAL层传给3A算法库。
  3. 3A算法根据Stats计算出新的参数(曝光时间、增益、白平衡增益、镜头位置)。
  4. 新参数写入ISP寄存器,影响下一帧的处理。

这个闭环每帧都在运行。帧率30fps的话,每秒就有30次调整。所以3A的收敛速度很关键——太快了画面会闪烁,太慢了跟不上场景变化。

调试小技巧: 我习惯在HAL层把每一帧的3A参数打印出来,观察它们的变化趋势。如果AEC在来回跳,说明收敛阻尼不够;如果AWB突然偏色,可能是场景切换时统计窗口没跟上。打印日志是调试3A最直接的手段。

1.5 避坑指南

最后,分享几个我踩过的坑,希望能帮你少走弯路。

曾经踩过的坑:
  • Sensor配置不对:有一次我换了传感器型号,但没改ISP的输入格式配置,结果画面全是花的。后来发现是Bayer排列顺序搞错了——RGGB和BGGR差一个像素,画面就全乱套。
  • LSC系数没更新:换了一款广角镜头,但LSC系数还是用之前的。结果画面四周暗角严重,中心过曝。LSC系数必须跟镜头一一对应,不能偷懒。
  • 3A统计窗口太小:默认的AEC统计窗口只覆盖画面中心区域。如果拍摄主体在边缘,AEC就会以背景亮度为准,导致主体过曝或欠曝。后来我把统计窗口改成了全图加权,效果好了很多。
  • AF在低对比度场景下反复拉风箱:拍白墙时,AF找不到对比度峰值,镜头来回移动。解决办法是加一个场景检测,检测到低对比度时,直接切到固定焦距(比如超焦距)。

好了,这一章的内容就到这里。ISP Pipeline的整体架构、数据流走向、以及AWB/AEC/AF这三个核心模块,你应该有了一个清晰的认识。下一章我们会深入HAL层,看看3A算法是怎么跟硬件交互的。

可可精品资料库