卷帘快门相机读出时间标定方法
卷帘快门相机读出时间(Readout Time)标定方法
一、引言
卷帘快门相机通过逐行曝光与读出传感器数据实现成像,其读出时间(Readout Time) 定义为从第一行数据读出到最后一行数据读出的总时长,是影响运动场景成像质量的关键参数(如导致倾斜畸变、果冻效应)。准确标定读出时间需先估计扫描速率(Scan Rate,$ r $)——单位时间内读出的行数(行/秒),再通过传感器总行数计算:
$$
\text{Readout Time} = \frac{\text{总行数 } (n_r)}{r}
$$
本文基于闪烁LED光源的周期性信号,结合频域分析方法,详细阐述扫描速率的标定原理、实验步骤及代码实现,最终实现读出时间的高精度测量。
二、数学原理:从时空信号到扫描速率
2.1 时空图像的周期性模型
当卷帘快门相机拍摄周期性闪烁的LED时,传感器每行的曝光时间由帧起始时间和行扫描延迟共同决定,形成具有二维周期性的时空图像。
设:
- $ f_{\text{LED}} $:LED闪烁频率(周期/秒,Hz);
- $ f $:相机帧率(帧/秒);
- $ r $:扫描速率(行/秒);
- $ y $:行索引(0到$ n_r-1 $,空间维度);
- $ k $:帧索引(0到$ n_f-1 $,时间维度)。
第$ y $行第$ k $帧的曝光时刻为:
$$
t_{\text{exposure}} = \frac{k}{f} + \frac{y}{r}
$$
LED亮度随时间的变化近似为正弦波:
$$
L(t) = A \sin(2\pi f_{\text{LED}} \cdot t + \phi) + B
$$
因此,时空图像的亮度函数为:
$$
I(y, k) = A \sin\left( 2\pi f_{\text{LED}} \left( \frac{y}{r} + \frac{k}{f} \right) + \phi \right) + B \tag{1}
$$
2.2 空间频率与时间频率的提取
公式(1)表明,时空图像在空间($ y $)和时间($ k $)维度均存在周期性,对应特定频率分量:
(1)空间频率$\nu$(沿$ y $方向)
固定帧索引$ k $,亮度随$ y $的变化为一维正弦函数:
$$
I(y) \propto \sin\left( 2\pi \cdot \frac{f_{\text{LED}}}{r} \cdot y + C \right)
$$
其空间频率(单位:周期/行)为:
$$
\nu = \frac{f_{\text{LED}}}{r} \tag{2}
$$
物理意义:每经过$ 1/|\nu| = r/f_{\text{LED}} $行,条纹重复一次。
(2)时间频率$\omega$(沿$ k $方向)
固定行索引$ y $,亮度随$ k $的变化为一维正弦函数:
$$
I(k) \propto \sin\left( 2\pi \cdot \frac{f_{\text{LED}}}{f} \cdot k + D \right)
$$
其时间频率(单位:周期/帧)为:
$$
\omega = \frac{f_{\text{LED}}}{f} \tag{3}
$$
物理意义:每经过$ 1/|\omega| = f/f_{\text{LED}} $帧,条纹重复一次。
2.3 二维傅里叶变换的频谱峰值
二维傅里叶变换将时空域的周期性信号转换为频域的峰值,峰值位置直接对应信号的频率分量。对于公式(1)的二维正弦函数,其傅里叶变换$\hat{I}(\nu, \omega)$的能量谱峰值满足:
$$
(\nu, \omega) = \left( \pm \frac{f_{\text{LED}}}{r}, \pm \frac{f_{\text{LED}}}{f} \right) \tag{4}
$$
原理:正弦函数可通过欧拉公式分解为两个复指数函数的差。每个复指数函数在频域对应一个冲激峰值,因此正负频率分量成对出现,形成对称的能量峰值。
2.4 扫描速率的估计逻辑
通过检测空间频率峰值$\nu_{\text{peak}}$,结合公式(2)可反推扫描速率:
$$
r = \frac{f_{\text{LED}}}{|\nu_{\text{peak}}|} \tag{5}
$$
进而计算读出时间:
$$
\text{Readout Time} = \frac{n_r}{r} \tag{6}
$$
三、实验步骤
3.1 硬件准备与环境设置
-
设备清单:
- 卷帘快门相机(如USB相机、工业相机);
- 可编程LED光源(支持固定频率闪烁,精度±0.1Hz);
- 遮光罩或暗箱(消除环境光干扰);
- 电脑(用于控制相机和LED,采集数据)。
-
环境搭建:
- 移除相机镜头(或对焦至无穷远),使传感器直接接收LED光;
- 将LED固定在相机正前方(距离50-100cm,确保光照均匀覆盖传感器);
- 关闭环境光源,用遮光罩包裹相机与LED,避免杂散光。
3.2 参数配置
-
LED参数:
- 闪烁频率$ f_{\text{LED}} $:建议50-200Hz(需与相机帧率错开,避免频率混叠);
- 占空比:50%(方波闪烁,其基频特性近似正弦波)。
-
相机参数:
- 帧率$ f $:10-60FPS(建议与LED频率无整数倍关系);
- 分辨率:选择高行数(如1080行),提高空间频率分辨率;
- 曝光时间:小于$ 1/f_{\text{LED}} $(如LED频率100Hz时,曝光时间≤10ms),确保条纹清晰。
3.3 数据采集
- 同步控制:启动LED闪烁,待稳定后触发相机采集图像序列(建议采集100-300帧)。
- 时空图像生成:
- 对每帧图像按列求和(
cv::reduce),将二维图像压缩为一维列向量。 - 将所有帧的列向量按顺序拼接,得到二维时空图像$ \text{spatio_temporal} \in \mathbb{R}^{n_r \times n_f} $,其中行对应传感器行索引$ y $,列对应帧索引$ k $。
- 对每帧图像按列求和(

3.4 数据处理(基于频域分析)
数据处理的核心逻辑封装在 EstimateScanRate 函数中,各步骤与C++代码实现对应如下:
(1)加汉宁窗:抑制频谱泄漏
1 | cv::Mat window; ... |
- 问题:有限长度的信号(行数$ n_r $、帧数$ n_f $)经傅里叶变换后会产生旁瓣(频谱泄漏),干扰主峰值。
- 作用:通过与二维汉宁窗相乘,平滑信号的边界,将能量更集中于主频,减少泄漏。二维窗由行、列两个一维汉宁窗外积而成。

(2)二维FFT与能量谱计算
1 | cv::dft(spatio_temporal_hanning, dft_result, ...); |
- 傅里叶变换:
cv::dft将时空图像$ I(y, k) $转换为频域复数矩阵$ \hat{I}(\nu, \omega) $。 - 能量谱:计算复数矩阵每个元素的模的平方,得到该频率分量的能量。
(3)时间频率轴边际化:提取空间频率总能量
1 | cv::reduce(fft2_mag, spatial_spectrum, 1, cv::REDUCE_SUM, CV_64F); |
- 目的:消除时间频率($ \omega $)维度的影响,获得每个空间频率($ \nu $)上的总能量。
- 实现:沿时间轴(
axis=1,即矩阵的列)对能量谱求和,得到一维空间频谱。
$$
\text{spatial_spectrum}(\nu) = \sum_{\omega=0}^{n_f-1} |\hat{I}(\nu, \omega)|^2
$$