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_translation 和 y_translation——每个坐标轴上的像素位移——以及 response,一个从 0.0 到 1.0 的置信度分数,其中 1.0 表示完美的峰值。滤除 response > 0.3 以下的检测结果,可以舍弃那些相位相关从未找到干净峰值的虚假结果。
在默认模式下,rotation 和 scale 分别为 0.0 和 1.0;只有当 logpolar=True 时它们才会取真实值(见下文)。
该方法带有两项实际约束。第一项是 二的幂次维度:处于相位相关核心的 FFT 在 32×32、64×64 和 128×128 这类尺寸下最快——并且在摄像头上也只有这些尺寸才被完全支持。最干净的做法是直接以这些尺寸之一进行捕获,方法是将分辨率作为元组传给 framesize():
csi0.framesize((64, 64))
如果应用需要从更大的帧中获取位移,则应从其关注的区域中裁剪出一块二的幂次大小的图块,并在该图块上运行匹配器。
第二项是 输入尺寸相同:roi 和 template_roi 必须选择完全相同的宽度和高度,否则匹配器会拒绝该调用。来自同一摄像头、同一配置的两次捕获会自动满足这一点;而将捕获帧与已加载的参考图像进行比较时,需要先将两者都裁剪为匹配的二的幂次图块。
5.31.2. 通过对数极坐标实现旋转与缩放¶
默认模式只查找 平移。当两帧还在围绕某个选定中心的 旋转 上、或围绕同一中心的 缩放 上有所不同时,对每幅图像的 对数极坐标 重投影运行相位相关,会把这些参数转化为对数极坐标系中的平移——而同一个相位相关匹配器就能将其恢复出来:
d = img.find_displacement(template, logpolar=True)
print("rotation rad:", d.rotation,
" scale:", d.scale,
" response:", d.response)
当 logpolar=True 时,该方法对经过对数极坐标投影的图像(而非原图)运行同样的匹配流程。结果的 rotation 和 scale 字段会被填入数值:rotation 是两帧之间的角度(以弧度表示),scale 是它们之间的缩放因子。在此模式下,x_translation 和 y_translation 变得没有意义(沿对数极坐标轴的平移并不对应于源图中的线性平移)。
fix_rotation_scale=True 关键字涵盖了介于两者之间的情况:两幅图像在平移 和 旋转/缩放上都有差异,而应用在校正旋转和缩放之后只需要 平移。匹配器先运行对数极坐标处理来恢复旋转和缩放,对其中一幅图像应用逆变换,然后再运行平移处理来恢复剩余的位移。该标志仅在 logpolar=False 时才有意义——它要求平移模式的匹配器先剥离旋转/缩放。
极坐标变换一节中的那个模式——笛卡尔 → 极坐标 → 匹配——正是 find_displacement() 在 logpolar=True 时一次调用所做的事情。应用在启动时存储一块参考对数极坐标图块,对每一帧实时画面进行捕获并做对数极坐标变换,该方法便能恢复它们之间的旋转与缩放差异。对于需要旋转不变且缩放不变的跟踪器的应用——例如一台对接机器人,其摄像头在接近目标时会倾斜和变焦;又如一个需要知道图像相对于参考如何旋转的稳定云台——这就是标准的构造方式。
5.31.3. 经典用法¶
find_displacement() 最常见的用法是在处理移动摄像头的流水线中做 帧间运动估计。摄像头在第 N 帧捕获一小块二的幂次图块,在第 N+1 帧捕获同尺寸的图块,对这两块运行 find_displacement(),并读取出它们之间的像素位移。这个位移就是两次捕获之间摄像头(或场景,取决于以谁的参考系为准)的估计运动,可用于:
光流式感知——一架装有朝下摄像头的悬停无人机,利用每帧的位移来估计其横向运动,并将其反馈给飞行控制器。
图像稳定——将连续帧之间的位移从捕获图像中减去,再进行记录或传输,从而产生更平滑的视频流。
检测对齐——一台沿传送带移动的扫描摄像头,利用每帧的位移将每一帧与下一帧配准,构建出整个部件的拼接视图。
上述每个应用都采用相同的形式:捕获、位移、累加到一个运行中的估计值,然后再次捕获。