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 做鲁棒估计。
适用场景:
- 多视角图像拼接(全景图)
- 平面物体的视角校正(如拍文档、拍屏幕)
- 增强现实中的平面跟踪
- 视频稳像中的大角度运动补偿
3.4 三种模型对比
为了方便你快速选择,我整理了一张对比表:
| 模型 | 自由度 | 能描述的形变 | 最小对应点数 | 计算复杂度 |
|---|---|---|---|---|
| 平移 | 2 | 平移 | 1 | 低 |
| 仿射 | 6 | 平移、旋转、缩放、剪切 | 3 | 中 |
| 透视 | 8 | 平移、旋转、缩放、剪切、透视变形 | 4 | 高 |
3.5 知识结构图
下面这张图帮你理清三种模型的关系和选择逻辑:
3.6 实际项目中的选择策略
说了这么多理论,最后聊聊我实际项目里的选择策略:
- 先看运动幅度:如果只是微抖动(±5像素以内),平移模型就够了。我做过一个手机防抖项目,平移模型处理了 90% 的帧。
- 再看场景结构:如果是平面场景(比如拍白板、拍文档),仿射模型通常够用。如果有明显的透视变形(比如从侧面拍建筑),必须上透视模型。
- 最后看计算资源:嵌入式设备上,透视模型的矩阵求逆可能很慢。我曾在树莓派上做实时视频拼接,最后被迫用仿射模型代替透视模型,虽然拼接精度差了一点,但帧率从 15fps 提到了 30fps。