3. 运动模型:平移、仿射、透视变换模型及其数学表示

做多帧合成,说白了就是要把不同时刻拍到的像素对齐到同一个坐标系里。怎么对齐?靠运动模型。我刚开始接触这个领域时,总觉得模型越多越复杂,后来才发现——选对模型,比堆模型重要得多。

今天咱们就聊聊三种最核心的运动模型:平移、仿射、透视。它们一个比一个灵活,但计算量也一个比一个大。你想想看,如果你的视频只是摄像头轻微晃动,用平移模型就够了;要是无人机航拍那种带旋转的,就得用仿射;要是拍建筑、拍地面,透视畸变明显,那就得上透视模型了。

核心观点:运动模型的选择,本质上是「自由度」与「计算代价」的权衡。自由度越高,能描述的形变越复杂,但求解也越困难。

3.1 平移模型(Translation Model)

平移模型是最简单的。它假设图像里的每个像素都朝同一个方向移动了相同的距离。说白了,就是整张图整体平移。

数学表示:

x' = x + dx
y' = y + dy

其中 (x, y) 是原始像素坐标,(x', y') 是运动后的坐标。dx 和 dy 就是水平和垂直方向的位移量。

这个模型只有 2 个自由度(dx, dy)。求解方法也很直接——我习惯用相位相关法或者光流法里的平移估计。

我的经验:平移模型最适合处理摄像头固定不动、只有轻微抖动的场景。比如手机防抖里的「电子稳像」,第一步往往就是平移估计。我曾经在一个手持拍摄的项目里只用平移模型做帧间对齐,效果出奇地好——因为抖动幅度小,平移已经够用了。

适用场景:

  • 固定摄像头拍摄的静态场景
  • 电子稳像中的全局运动估计
  • 视频拼接中的粗略对齐
注意:平移模型无法处理旋转、缩放、透视变形。如果你的视频里有明显的旋转或远近变化,平移模型会直接失效——我踩过这个坑,当时用平移模型做航拍视频拼接,结果拼出来的图全是错位的。

3.2 仿射变换模型(Affine Transformation)

仿射变换比平移灵活多了。它可以描述平移、旋转、缩放、剪切(skew)这几种形变。你想想看,一张照片被拉伸、旋转、压扁,这些都能用仿射模型搞定。

数学表示:

[x']   [a  b  tx] [x]
[y'] = [c  d  ty] [y]
[1 ]   [0  0  1 ] [1]

展开来写就是:

x' = a*x + b*y + tx
y' = c*x + d*y + ty

这里有 6 个自由度(a, b, c, d, tx, ty)。其中 tx, ty 是平移量,a, b, c, d 组合起来控制旋转、缩放和剪切。

仿射变换有个重要性质:平行线变换后仍然是平行线。这个性质在很多场景下非常有用。

关键点:仿射变换是线性变换 + 平移的组合。它保持直线的「直线性」和「平行性」。

求解方法:至少需要 3 组对应点(不共线)才能解出 6 个参数。我一般用最小二乘法或者 RANSAC 来求解。

避坑指南:我曾经在一个无人机视频拼接项目里,用仿射模型做帧间配准。结果发现,当无人机转弯时,仿射模型勉强能跟上,但到了画面边缘,拼接痕迹特别明显。后来我才意识到——仿射模型假设的是「平面场景」,而实际航拍画面里地面是有起伏的。所以,选模型之前,先想清楚你的场景是不是「平面」。

适用场景:

  • 手持设备拍摄的旋转+平移抖动
  • 无人机航拍视频的帧间对齐
  • 文档扫描、图像配准
  • 视频稳像中的全局运动补偿

3.3 透视变换模型(Perspective Transformation / Homography)

透视变换是最灵活的。它能描述所有仿射变换能做的事,还能处理透视变形——比如你从侧面拍一个广告牌,原本是矩形的,拍出来变成梯形了。这种变形,仿射模型搞不定,但透视模型可以。

数学表示:

[x']   [h11  h12  h13] [x]
[y'] = [h21  h22  h23] [y]
[w']   [h31  h32  h33] [w]

其中 w 是齐次坐标的缩放因子。最终像素坐标是:

x' = (h11*x + h12*y + h13) / (h31*x + h32*y + h33)
y' = (h21*x + h22*y + h23) / (h31*x + h32*y + h33)

这里有 8 个自由度(h11 到 h33,但 h33 通常归一化为 1)。

重要性质:透视变换保持直线的「直线性」,但不保持平行性。平行线在透视变换下可能会相交于一点(消失点)。

求解方法:至少需要 4 组对应点(任意 3 点不共线)才能解出 8 个参数。我常用的方法是 DLT(Direct Linear Transform)加上 RANSAC 做鲁棒估计。

注意:透视变换的参数求解对噪声非常敏感。我曾经在一个低光照视频里用透视模型做配准,结果因为特征点匹配质量太差,求出来的变换矩阵完全不对。后来我加了特征点筛选和 RANSAC 迭代,才稳定下来。所以,数据质量决定模型上限。

适用场景:

  • 多视角图像拼接(全景图)
  • 平面物体的视角校正(如拍文档、拍屏幕)
  • 增强现实中的平面跟踪
  • 视频稳像中的大角度运动补偿

3.4 三种模型对比

为了方便你快速选择,我整理了一张对比表:

模型 自由度 能描述的形变 最小对应点数 计算复杂度
平移 2 平移 1 低
仿射 6 平移、旋转、缩放、剪切 3 中
透视 8 平移、旋转、缩放、剪切、透视变形 4 高
我的建议:在实际项目中,从最简单的模型开始试。如果平移模型效果够好,就别上仿射;如果仿射够用,就别上透视。每增加一个自由度,不仅计算量变大,对特征点质量的要求也更高。我见过太多人一上来就用透视模型,结果反而因为过拟合导致效果更差。

3.5 知识结构图

下面这张图帮你理清三种模型的关系和选择逻辑:

运动模型知识结构图 运动模型选择与关系图 运动模型 平移模型 (2 DOF) 仿射模型 (6 DOF) 透视模型 (8 DOF) 能力 仅平移 无旋转/缩放 能力 平移+旋转+缩放+剪切 保持平行性 能力 包含仿射所有能力 + 透视变形 选择建议 从最简单的模型开始试 → 效果不够再升级 平移够用 → 不用仿射;仿射够用 → 不用透视 自由度越高 → 对特征点质量和数量要求越高

3.6 实际项目中的选择策略

说了这么多理论,最后聊聊我实际项目里的选择策略:

  1. 先看运动幅度:如果只是微抖动(±5像素以内),平移模型就够了。我做过一个手机防抖项目,平移模型处理了 90% 的帧。
  2. 再看场景结构:如果是平面场景(比如拍白板、拍文档),仿射模型通常够用。如果有明显的透视变形(比如从侧面拍建筑),必须上透视模型。
  3. 最后看计算资源:嵌入式设备上,透视模型的矩阵求逆可能很慢。我曾在树莓派上做实时视频拼接,最后被迫用仿射模型代替透视模型,虽然拼接精度差了一点,但帧率从 15fps 提到了 30fps。
总结:平移、仿射、透视,三种模型构成了运动估计的「工具箱」。理解它们的数学本质和适用边界,比背公式更重要。选对了模型,你的多帧合成效果就成功了一半。