3. RAW图采集:Sensor驱动配置、RAW图抓取命令与格式解析

RAW图采集是ISP调试流程的起点,其质量直接决定后续所有参数调试的有效性。本节将系统讲解Sensor驱动配置要点、RAW图抓取工具与ioctl命令机制,以及Bayer/Raw10/Raw12等RAW格式的存储与解析原理。

3.1 Sensor驱动配置要点

在RK平台上,Sensor驱动通常基于V4L2(Video for Linux 2)框架实现。驱动配置的核心目标是确保Sensor输出正确的RAW数据流,包括分辨率、帧率、曝光模式、增益范围以及MIPI/LVDS接口时序。

配置项 典型值/范围 说明
分辨率 1920x1080 / 3840x2160 需与Sensor实际输出匹配
帧率 30fps / 60fps 受MIPI带宽和ISP处理能力限制
曝光模式 逐行曝光 / 全局曝光 滚动快门Sensor常用逐行曝光
增益范围 1x ~ 16x (模拟增益) 数字增益会引入额外噪声
输出格式 RAW10 / RAW12 位深决定动态范围
MIPI Lane数 2-lane / 4-lane 影响最大传输速率
调试提示: 驱动配置中务必确认Sensor的黑电平(Black Level)寄存器值。不同Sensor的黑电平基准可能不同(如64/1024/4096),该值在后续RAW图解析和去噪处理中至关重要。

3.2 RAW图抓取命令与ioctl机制

RAW图抓取通常通过用户空间工具调用V4L2 ioctl接口完成。RK平台常用的抓图工具包括v4l2-ctl、media-ctl以及自研的rkisp_demo或rk_aiq_tool。

3.2.1 常用抓图命令示例

# 设置Sensor输出格式为RAW10,分辨率1920x1080
v4l2-ctl -d /dev/video0 --set-fmt-video=width=1920,height=1080,pixelformat=RG10

# 抓取单帧RAW图并保存为文件
v4l2-ctl -d /dev/video0 --stream-mmap --stream-count=1 --stream-to=raw_frame.raw

# 通过media-ctl配置pipeline
media-ctl -d /dev/media0 -l '"m00_b_sensor 0-0036":0->"rkisp-isp-subdev":0[1]'
media-ctl -d /dev/media0 -V '"m00_b_sensor 0-0036":0 [fmt:SRGGB10/1920x1080]'

3.2.2 ioctl调用流程

抓图工具底层通过以下ioctl命令序列完成RAW帧采集:

  1. VIDIOC_QUERYCAP:查询设备能力
  2. VIDIOC_S_FMT:设置输出格式(包括像素格式、分辨率)
  3. VIDIOC_REQBUFS:申请帧缓冲区(通常使用mmap模式)
  4. VIDIOC_QBUF:将缓冲区加入队列
  5. VIDIOC_STREAMON:启动数据流
  6. VIDIOC_DQBUF:从队列取出已填充数据的缓冲区
  7. VIDIOC_STREAMOFF:停止数据流
关键点: 在RK平台ISP子系统中,RAW图抓取通常经过Sensor → CSI控制器 → ISP输入的pipeline。使用media-ctl正确配置链路是成功抓图的前提。

3.3 RAW图格式解析

RAW图是Sensor直接输出的未经插值处理的像素数据。理解其格式是后续ISP调试的基础。

3.3.1 Bayer模式

大多数彩色Sensor使用Bayer滤色阵列,每个像素只采集红、绿、蓝中的一个颜色分量。常见的Bayer模式包括:

  • RGGB:第一行RGRG…,第二行GBGB…
  • BGGR:第一行BGBG…,第二行GRGR…
  • GRBG:第一行GRGR…,第二行BGBG…
  • GBRG:第一行GBGB…,第二行RGRG…

Bayer模式信息通常存储在驱动或Sensor配置中,ISP的demosaic模块需要根据该模式正确重建全彩色图像。

3.3.2 RAW10与RAW12位深格式

RAW10和RAW12分别表示每个像素占用10位或12位数据。由于存储对齐要求,实际存储方式有所不同:

格式 每像素位数 存储方式 典型像素编码
RAW8 8 每像素1字节 0x00 ~ 0xFF
RAW10 10 4像素打包为5字节 高8位 + 低2位拼接
RAW12 12 2像素打包为3字节 高8位 + 低4位拼接
常见错误: 直接按字节读取RAW10/RAW12文件会导致数据错位。必须按照打包规则解包:RAW10每5字节包含4个像素,RAW12每3字节包含2个像素。解析时需注意字节序(大端/小端)。

3.3.3 RAW10打包格式详解

以RAW10为例,4个像素(P0~P3)打包在5字节中的排列规则如下:

Byte 0: P0[9:2]  (高8位)
Byte 1: P1[9:2]  (高8位)
Byte 2: P2[9:2]  (高8位)
Byte 3: P3[9:2]  (高8位)
Byte 4: P3[1:0] | P2[1:0] << 2 | P1[1:0] << 4 | P0[1:0] << 6
        (低2位拼接,P0在最低位)

解析时需将每个像素的高8位与低2位组合:pixel = (high_byte << 2) | low_bits。

3.4 RAW图采集流程总览

RAW图采集流程总览 Sensor驱动配置 分辨率/帧率/格式 MIPI/CSI传输 Lane配置/时钟 ISP接收 RAW数据入队 ioctl抓图命令 v4l2-ctl / media-ctl 帧缓冲区 mmap / DMA RAW文件保存 raw_frame.raw RAW格式解析 Bayer / RAW10 / RAW12 后续ISP处理 黑电平/去噪/Demosaic 说明: 整个流程从Sensor驱动配置开始,经过MIPI传输到ISP接收,再通过ioctl命令抓取帧数据保存为RAW文件。 最后对RAW文件进行格式解析,确认Bayer模式和位深正确后,才能进入后续ISP参数调试阶段。

3.5 RAW图验证与常见问题

抓取RAW图后,建议立即进行以下验证:

  • 文件大小检查:根据分辨率、位深和打包格式计算理论大小,与实际文件对比。例如1920x1080 RAW10的理论大小为 1920 * 1080 * 10 / 8 = 2,592,000 字节。
  • Bayer模式验证:使用RAW查看工具(如RawTherapee、dcraw)打开,检查颜色分布是否与预期Bayer模式一致。
  • 黑电平检查:读取全黑帧的像素均值,确认与Sensor寄存器配置的黑电平值一致。
  • 坏点检查:观察是否存在固定亮点或暗点,这些需要在ISP中做坏点校正。
实战建议: 在RK平台调试初期,建议先抓取一帧全黑RAW图和一帧均匀光照下的RAW图,用于验证黑电平、增益和格式解析的正确性。这两个基础测试帧可以排除大量后续调试中的干扰因素。