基本假设
光流法一般默认同一个点在相邻帧中的亮度变化不大,而且移动距离不会太夸张。Lucas-Kanade 方法还假设一个小窗口里的像素运动比较接近,所以可以在局部范围内估计运动向量。
实验流程
- 读取两张相邻图像,并检查图像尺寸是否一致。
- 转换为灰度图,使用
cv2.goodFeaturesToTrack检测 Shi-Tomasi 角点。 - 设置 Lucas-Kanade 参数,包括窗口大小、金字塔层级和迭代终止条件。
- 调用
cv2.calcOpticalFlowPyrLK估计角点在第二张图像中的新位置。 - 根据状态标记过滤有效点,并用箭头和圆点可视化运动方向。
为什么先找角点
光流对点的位置也有要求。平坦区域缺少纹理,沿边缘方向也容易判断不准。角点在两个方向上都有明显变化,更容易被跟踪。所以实验里先用 Shi-Tomasi 找角点,再计算这些点的稀疏光流。
我的思考
做光流实验时,我明显感觉到视频比单张图多了一层信息。单张图只能看出画面内容,相邻帧之间的变化可以反映物体运动和相机运动。目标跟踪、视频理解、视觉导航都会用到这类信息。
Lucas-Kanade 方法写起来不复杂,速度也快,但遇到大位移、遮挡、光照变化时会不稳定。后面如果继续做,可以加入图像金字塔、前后向一致性检查,或者和重新检测角点结合起来。