卷帘快门相机读出时间(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 硬件准备与环境设置
  1. 设备清单

    • 卷帘快门相机(如USB相机、工业相机);
    • 可编程LED光源(支持固定频率闪烁,精度±0.1Hz);
    • 遮光罩或暗箱(消除环境光干扰);
    • 电脑(用于控制相机和LED,采集数据)。
  2. 环境搭建

    • 移除相机镜头(或对焦至无穷远),使传感器直接接收LED光;
    • 将LED固定在相机正前方(距离50-100cm,确保光照均匀覆盖传感器);
    • 关闭环境光源,用遮光罩包裹相机与LED,避免杂散光。
3.2 参数配置
  1. LED参数

    • 闪烁频率$ f_{\text{LED}} $:建议50-200Hz(需与相机帧率错开,避免频率混叠);
    • 占空比:50%(方波闪烁,其基频特性近似正弦波)。
  2. 相机参数

    • 帧率$ f $:10-60FPS(建议与LED频率无整数倍关系);
    • 分辨率:选择高行数(如1080行),提高空间频率分辨率;
    • 曝光时间:小于$ 1/f_{\text{LED}} $(如LED频率100Hz时,曝光时间≤10ms),确保条纹清晰。
3.3 数据采集
  1. 同步控制:启动LED闪烁,待稳定后触发相机采集图像序列(建议采集100-300帧)。
  2. 时空图像生成
    • 对每帧图像按列求和(cv::reduce),将二维图像压缩为一维列向量。
    • 将所有帧的列向量按顺序拼接,得到二维时空图像$ \text{spatio_temporal} \in \mathbb{R}^{n_r \times n_f} $,其中行对应传感器行索引$ y $,列对应帧索引$ k $。

3.4 数据处理(基于频域分析)

数据处理的核心逻辑封装在 EstimateScanRate 函数中,各步骤与C++代码实现对应如下:

(1)加汉宁窗:抑制频谱泄漏
1
2
cv::Mat window; ...
cv::multiply(spatio_temporal, window, spatio_temporal_hanning);
  • 问题:有限长度的信号(行数$ n_r $、帧数$ n_f $)经傅里叶变换后会产生旁瓣(频谱泄漏),干扰主峰值。
  • 作用:通过与二维汉宁窗相乘,平滑信号的边界,将能量更集中于主频,减少泄漏。二维窗由行、列两个一维汉宁窗外积而成。

hanning

(2)二维FFT与能量谱计算
1
2
3
4
cv::dft(spatio_temporal_hanning, dft_result, ...);
cv::split(dft_result, planes);
cv::magnitude(planes[0], planes[1], fft2_mag);
cv::pow(fft2_mag, 2, fft2_mag);
  • 傅里叶变换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
    $$