我正在使用 createOptFlow_DualTVL1()
来计算光流,这正是我想要的,但它非常慢。有什么办法可以加快它的速度,或者有没有其他光流功能可以用更少的处理时间给我同样的结果?
我用过 calcOpticalFlowFarneback()
、cvGoodFeaturesToTrack()
但质量不好。请帮忙。
提前谢谢你下面是我如何应用createOptFlow_DualTVL1()
Ptr<DenseOpticalFlow> tvl1 = createOptFlow_DualTVL1();
tvl1->calc(Previous_Gray_Frame, Current_Gray_Frame, Optical_Flow);
最佳答案
为了加快计算速度,您需要减少每次执行的计算总数。这似乎是显而易见的,但实现该目标的大量策略可能令人困惑。因此,这里有一些建议:
减小图像的大小(输入数据)。特别是,您应该尝试沿每个维度将它们的大小除以 2,计算流量,然后使用线性插值计算全尺寸流量。除非您的应用程序需要非常高的准确性,否则此解决方案应该是可以接受的,并且会给您带来巨大的加速。
减少每个尺度的扭曲数量(参数:
扭曲
)。这会稍微损害准确性,但除非您有非常困难的运动模式(例如,当所有图像像素都朝不同方向移动时,或者当图像内部有非常快的运动时),结果应该仍然可以接受。该算法在图像金字塔的每个级别运行最小化程序warps
次,因此即使warps
的微小变化也会给您显着的加速。减少图像金字塔中的层数(参数:
scales
)。不过,这会对准确性产生重要影响,因此请小心并进行大量试验。在文献中发现,级别之间的良好(对于准确性)比例因子是 0.8,因此您应该相应地计算您的级别数。在0.8之前,光流实验的标准是0.5的比例因子,所以你可以尝试降到这个值。收敛速度:理论上,L1 最小化的内部过程对于高达 1/8 (0.125) 的时间步长(参数:
tau
)是稳定的,但在实践中值为 1/已知 4 (0.25) 仍然有效。
关于opencv - 加速光流 (createOptFlow_DualTVL1),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19309567/