5.31. 位移匹配

模板匹配回答的是 这块图块在帧中的什么位置;相似度评分回答的是 这两幅图像整体上有多相像。介于两者之间的是另一个问题:两帧显示的是同一场景,但摄像头(或场景)在两帧之间发生了移动——移动了多少? 这就是 位移(displacement)问题,image 模块用单个相位相关方法来解决它。

5.31.1. 相位相关位移

find_displacement() 使用 相位相关 来估计两幅同尺寸图像之间的刚性对齐——这是一种频域方法,它对每幅图像运行快速傅里叶变换(FFT),对它们的相位进行互相关,并在结果中定位峰值。峰值的位置就是使两幅图像对齐的平移量:

d = img.find_displacement(template)

print("shift:", d.x_translation, d.y_translation,
      " response:", d.response)

返回的 Displacement 携带 x_translationy_translation——每个坐标轴上的像素位移——以及 response,一个从 0.01.0 的置信度分数,其中 1.0 表示完美的峰值。滤除 response > 0.3 以下的检测结果,可以舍弃那些相位相关从未找到干净峰值的虚假结果。

在默认模式下,rotationscale 分别为 0.0 和 1.0;只有当 logpolar=True 时它们才会取真实值(见下文)。

该方法带有两项实际约束。第一项是 二的幂次维度:处于相位相关核心的 FFT 在 32×32、64×64 和 128×128 这类尺寸下最快——并且在摄像头上也只有这些尺寸才被完全支持。最干净的做法是直接以这些尺寸之一进行捕获,方法是将分辨率作为元组传给 framesize()

csi0.framesize((64, 64))

如果应用需要从更大的帧中获取位移,则应从其关注的区域中裁剪出一块二的幂次大小的图块,并在该图块上运行匹配器。

第二项是 输入尺寸相同roitemplate_roi 必须选择完全相同的宽度和高度,否则匹配器会拒绝该调用。来自同一摄像头、同一配置的两次捕获会自动满足这一点;而将捕获帧与已加载的参考图像进行比较时,需要先将两者都裁剪为匹配的二的幂次图块。

5.31.2. 通过对数极坐标实现旋转与缩放

默认模式只查找 平移。当两帧还在围绕某个选定中心的 旋转 上、或围绕同一中心的 缩放 上有所不同时,对每幅图像的 对数极坐标 重投影运行相位相关,会把这些参数转化为对数极坐标系中的平移——而同一个相位相关匹配器就能将其恢复出来:

d = img.find_displacement(template, logpolar=True)

print("rotation rad:", d.rotation,
      " scale:", d.scale,
      " response:", d.response)

logpolar=True 时,该方法对经过对数极坐标投影的图像(而非原图)运行同样的匹配流程。结果的 rotationscale 字段会被填入数值:rotation 是两帧之间的角度(以弧度表示),scale 是它们之间的缩放因子。在此模式下,x_translationy_translation 变得没有意义(沿对数极坐标轴的平移并不对应于源图中的线性平移)。

fix_rotation_scale=True 关键字涵盖了介于两者之间的情况:两幅图像在平移 旋转/缩放上都有差异,而应用在校正旋转和缩放之后只需要 平移。匹配器先运行对数极坐标处理来恢复旋转和缩放,对其中一幅图像应用逆变换,然后再运行平移处理来恢复剩余的位移。该标志仅在 logpolar=False 时才有意义——它要求平移模式的匹配器先剥离旋转/缩放。

极坐标变换一节中的那个模式——笛卡尔 → 极坐标 → 匹配——正是 find_displacement()logpolar=True 时一次调用所做的事情。应用在启动时存储一块参考对数极坐标图块,对每一帧实时画面进行捕获并做对数极坐标变换,该方法便能恢复它们之间的旋转与缩放差异。对于需要旋转不变且缩放不变的跟踪器的应用——例如一台对接机器人,其摄像头在接近目标时会倾斜和变焦;又如一个需要知道图像相对于参考如何旋转的稳定云台——这就是标准的构造方式。

5.31.3. 经典用法

find_displacement() 最常见的用法是在处理移动摄像头的流水线中做 帧间运动估计。摄像头在第 N 帧捕获一小块二的幂次图块,在第 N+1 帧捕获同尺寸的图块,对这两块运行 find_displacement(),并读取出它们之间的像素位移。这个位移就是两次捕获之间摄像头(或场景,取决于以谁的参考系为准)的估计运动,可用于:

  • 光流式感知——一架装有朝下摄像头的悬停无人机,利用每帧的位移来估计其横向运动,并将其反馈给飞行控制器。

  • 图像稳定——将连续帧之间的位移从捕获图像中减去,再进行记录或传输,从而产生更平滑的视频流。

  • 检测对齐——一台沿传送带移动的扫描摄像头,利用每帧的位移将每一帧与下一帧配准,构建出整个部件的拼接视图。

上述每个应用都采用相同的形式:捕获、位移、累加到一个运行中的估计值,然后再次捕获。