我正在研究光流,并根据这里的讲义和互联网上的一些示例,我编写了这个 Python 代码。
所有代码和示例图像也都在那里。对于大约 4-5 像素的小位移,计算的矢量方向似乎很好,但矢量的幅度太小(这就是为什么我必须在绘制它们之前将 u,v 乘以 3)。
这是因为算法的限制,还是代码中的错误?上面分享的讲义还说运动需要很小“u,v小于1像素”,也许这就是原因。这种限制的原因是什么?
我正在研究光流,并根据这里的讲义和互联网上的一些示例,我编写了这个 Python 代码。
所有代码和示例图像也都在那里。对于大约 4-5 像素的小位移,计算的矢量方向似乎很好,但矢量的幅度太小(这就是为什么我必须在绘制它们之前将 u,v 乘以 3)。
这是因为算法的限制,还是代码中的错误?上面分享的讲义还说运动需要很小“u,v小于1像素”,也许这就是原因。这种限制的原因是什么?
@belisarius says "LK uses a first order approximation, and so (u,v) should be ideally << 1, if not, higher order terms dominate the behavior and you are toast. ".
光流约束方程的标准结论(OFCE,您参考的幻灯片 5)是“您的运动应该小于一个像素,更少的高阶项会杀死您”。虽然在技术上是正确的,但您可以在实践中使用更大的平均窗口来克服这个问题。这要求您进行理智的统计,即不是纯最小二乘均值,如幻灯片中所建议的那样。通过 Tikhonov 正则化可以实现同样快速的计算和非常出色的结果。这需要设置一个调整值(Tikhonov 常数)。这可以作为一个全局常数来完成,或者让它适应图像中的局部信息(例如 Shi-Tomasi 置信度,又名结构张量行列式)。
请注意,这并不能取代多尺度方法来处理更大运动的需要。它可能会稍微扩展任何单个刻度可以处理的范围。
实现、可视化和代码在此处以教程格式提供,尽管在 Matlab 中不是 Python。