基本假设

光流法一般默认同一个点在相邻帧中的亮度变化不大,而且移动距离不会太夸张。Lucas-Kanade 方法还假设一个小窗口里的像素运动比较接近,所以可以在局部范围内估计运动向量。

实验流程

  • 读取两张相邻图像,并检查图像尺寸是否一致。
  • 转换为灰度图,使用 cv2.goodFeaturesToTrack 检测 Shi-Tomasi 角点。
  • 设置 Lucas-Kanade 参数,包括窗口大小、金字塔层级和迭代终止条件。
  • 调用 cv2.calcOpticalFlowPyrLK 估计角点在第二张图像中的新位置。
  • 根据状态标记过滤有效点,并用箭头和圆点可视化运动方向。
光流实验第一帧图像 光流实验第二帧图像
光流实验使用的两张相邻图像。

为什么先找角点

光流对点的位置也有要求。平坦区域缺少纹理,沿边缘方向也容易判断不准。角点在两个方向上都有明显变化,更容易被跟踪。所以实验里先用 Shi-Tomasi 找角点,再计算这些点的稀疏光流。

Lucas-Kanade 光流运动向量可视化结果
Lucas-Kanade 光流结果,红色箭头表示角点从第一帧到第二帧的移动方向。

我的思考

做光流实验时,我明显感觉到视频比单张图多了一层信息。单张图只能看出画面内容,相邻帧之间的变化可以反映物体运动和相机运动。目标跟踪、视频理解、视觉导航都会用到这类信息。

Lucas-Kanade 方法写起来不复杂,速度也快,但遇到大位移、遮挡、光照变化时会不稳定。后面如果继续做,可以加入图像金字塔、前后向一致性检查,或者和重新检测角点结合起来。