4.20. 总结

你已经走过了摄像头成像栈中每次脚本捕获一帧时都会涉及的各个部分:

  • 传感器前方的光学元件——以针孔作为最简单的成像元件,然后是镜头,它在依然能聚焦的同时收集多得多的光线,应用可从焦距、光圈、景深和视场这些旋钮中进行选择。真实镜头会带来畸变、渐晕和主光线角效应,这些随后由传感器和 ISP 加以补偿。

  • 传感器栅格——一个将光子转化为电荷的二维光电二极管阵列,曝光时间和模拟增益在亮度与运动模糊和噪声之间进行权衡。卷帘快门和全局快门决定阵列各行如何读出,而一小组片上校准——列 FPN、黑电平、缺陷像素、镜头阴影——在数据离开芯片前对其进行清理。两条总线将芯片连接到 MCU:一条用于寄存器的慢速 I2C 控制总线,以及一条用于像素的快速并行或 MIPI 总线。

  • 颜色与 ISP——拜耳颜色滤镜阵列为每个像素赋予红、绿或蓝中的一种;去拜耳处理对缺失的另外两个通道进行插值。图像信号处理器将流水线的其余部分串联起来——统计提取、自动白平衡、去拜耳、颜色矩阵校正、伽马、缩放、裁剪,以及最终打包成所请求的像素格式。

  • 像素格式——原始拜耳、RGB888、RGB565、YUV422、灰度、BINARY,以及压缩的 JPEG / PNG 输出,它们在内存大小与颜色保真度和下游算法兼容性之间进行权衡。RGB565 是成品彩色的默认格式,因为它与 MCU 的字宽对齐,并且相对于 RGB888 将内存开销减半。

  • CSI API——五行设置加上一个快照循环就是每个脚本的起始形态。帧缓冲区池(单、双、三、视频 FIFO 或触发式)决定应用和摄像头如何共享帧;一个独立的预览通道在不与应用的缓冲区争用的情况下向所连接的任何调试程序供给数据;传感器旋钮涵盖朝向、曝光、增益、白平衡、帧率上限以及彩条测试图案。

  • 多传感器与内存池——带两个传感器的板卡会为每个芯片实例化一个 CSI,并让每个以各自的速率运行。在底层,帧缓冲区池、预览区域、MicroPython 堆以及较小的快速内存分配位于 RAM 的不同区域中,这样布置使得需要速度的部分获得速度,而只需容量的部分获得容量。

这足以从传感器中取出一帧,并为场景配以正确的格式、帧大小和曝光;选择一个与应用处理时间相匹配的帧缓冲区模式;向所连接的任何设备暴露实时预览;并将 Image 读回 Python,准备对其进行操作。

4.20.1. 稍后使用本参考

把成像章节当作参考资料,而不是一遍读完的内容。回过头来重温帧缓冲区模式、像素格式或某个特定传感器旋钮的含义,正是其预期用途。当问题只是“这个调用的确切名称又是什么”时,csi.CSI 参考页面会在一处列出每个方法。

4.20.2. 下一步何去何从

图像处理是自然而然的下一个主题。在手握缓冲区并理解了 csi API 之后,剩下的就是用这些像素去什么:阈值、边缘检测、色块查找、直线和形状检测、QR 码、AprilTag、机器学习推理。工具集转向 image 模块及其在 Image 对象上的方法目录。本节中的一切都会延续下去;循环形态、帧缓冲区模式、像素格式——所有这些正是图像处理方法所操作的对象。