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帧采集:
- VIDIOC_QUERYCAP:查询设备能力
- VIDIOC_S_FMT:设置输出格式(包括像素格式、分辨率)
- VIDIOC_REQBUFS:申请帧缓冲区(通常使用mmap模式)
- VIDIOC_QBUF:将缓冲区加入队列
- VIDIOC_STREAMON:启动数据流
- VIDIOC_DQBUF:从队列取出已填充数据的缓冲区
- 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图采集流程总览
3.5 RAW图验证与常见问题
抓取RAW图后,建议立即进行以下验证:
- 文件大小检查:根据分辨率、位深和打包格式计算理论大小,与实际文件对比。例如1920x1080 RAW10的理论大小为
1920 * 1080 * 10 / 8 = 2,592,000 字节。 - Bayer模式验证:使用RAW查看工具(如RawTherapee、dcraw)打开,检查颜色分布是否与预期Bayer模式一致。
- 黑电平检查:读取全黑帧的像素均值,确认与Sensor寄存器配置的黑电平值一致。
- 坏点检查:观察是否存在固定亮点或暗点,这些需要在ISP中做坏点校正。
实战建议: 在RK平台调试初期,建议先抓取一帧全黑RAW图和一帧均匀光照下的RAW图,用于验证黑电平、增益和格式解析的正确性。这两个基础测试帧可以排除大量后续调试中的干扰因素。