本文参考资料:
[1] (Strongly Recommend!) Fundamentals and Experiments of Line Scan Camera:
[2] 线阵 CCD 的使用方法(以 TCD1304 为例): https://zzi.io/?p=1091
工程地址:https://github.com/divertingPan/Line_Scan_Camera
原文地址:https://divertingpan.github.io/post/line_scan_camera
前言 Overview这篇是接续【硬核摄影】给火车拍个全身照和光流法应用——自适应检测视频火车速度的内容。但是实则整个工程和前作关系又不是那么密切,只能算是精神续作。
实际上,这篇2.0的内容是之前做软件层面的视频扫描代码的精神鼻祖。这个扫描相机的原项目[1]是2011年左右设计的,老潘在大概2018年看到的这个并且尝试复现(失败),但一直对这个项目留有念想。因为已经大致了解了原理,所以就用视频录像做了这个相机的模拟版。结果在2021年的时候突然得知,国内PCB厂商居然开始免费打样,于是老潘决定重启这个项目,告别繁杂的飞线,拆解原来的洞洞板,直接上PCB。
老潘在原来的设计基础上做了一些小改动。本篇主要是为了记录复现过程中趟过的无数大小坑,以及对本项目的改进的一些指南。
本项目完全开源在github上,包括电路,PCB,硬件代码,各种资料等。
老潘不是专业搞硬件开发的,所以肯定很多地方说不明白,希望各位能给予指导或者纠正。
一些效果展示:
这个是手持平移扫过桌上的静物,因为手抖所以会有变形。
这是架在路边拍摄,因为光圈开到最大,对焦在中央车道,近景就会失焦模糊。
一个完整的扫描结果,没有调整长宽比例的原始图像。
火车虽迟但到,可惜这个相机想要准确取景对焦十分考验手感,导致出片率不高。
线性 vs 二维这种一维相机也能拍照的原理在前面篇章里已经介绍了,如果理解了线性扫描的原理,这个相机的原理是一模一样的。只是利用线性的CCD直接从拍摄(或者说录制视频)这个地方就已经做好了固定位置-连续取帧-逐帧拼接成图这么个过程。
这时候会有人问:既然能用录像机直接录像之后用软件拼图,那毫无必要用线性CCD来做这个?这时候我们应该考虑一下两种方法的优劣,来选择到底用哪种方法。
线性CCD器件的分辨率可以轻松做到10000×n,即CCD的单帧覆盖像素可以做到很高,这点在当前的二维传感器上很难实现(即使强如GFX 100可以做到最长边11648×8736分辨率,但是成本爆炸,而且还会带来第二点问题)
线性CCD只有1维的数据,在高速采集中对外围电路要求更低(GFX 100和一个线性CCD,同时设计每秒1000帧的采样速度,难度差异显而易见)。有人会说:二维器件的采样率限制可以利用二维平面弥补(即,11648×8736×1帧,采集图像范围等同于11648×1×8736帧),但是前文已经实验证明,利用视频的窄窗来模拟线性扫描的前提是,开窗的尺寸不能太大,否则会出现透视效应。因此,二维CMOS或者CCD器件会有大量数据浪费。
承接上条,利用线性CCD可以节约存储空间和IO开销。
使用CCD的缺点是,由于存在采样率上限,因此速度超过帧速率上限的物体会发生形变,且丢失的帧细节无法弥补,通过二维器件的录像和后处理,可以利用窄窗弥补。(这里的速度-帧率-窗尺寸关系在前作也有推导,线性CCD设定窗宽度固定为1即可)
尽管如此,窄窗仍然会带来以下问题,且很难通过简单的后期手法修正:
开窗的窗宽度和目标运动速度紧密相关,并且分正负。
带有透视的物体,无法统一开窗宽度。
对于变速的物体,对开窗宽度非常敏感。
物体受到固定位置的光影反射会产生条纹干扰。
如图所示: