我正在使用createOptFlow_DualTVL1()
来计算光流量,它正是我想要的,但它非常慢。有什么方法可以加快它的速度,还是有任何其他光流功能可以给我相同的结果,减少处理时间?
我使用了calcOpticalFlowFarneback()
,cvGoodFeaturesToTrack()
,但质量不高。请帮忙。
提前谢谢以下是我申请createOptFlow_DualTVL1()
Ptr<DenseOpticalFlow> tvl1 = createOptFlow_DualTVL1();
tvl1->calc(Previous_Gray_Frame, Current_Gray_Frame, Optical_Flow);
答案 0 :(得分:11)
为了加快计算速度,您需要减少每次执行的计算总次数。这看起来很明显,但实现这一目标的大量策略可能令人困惑。所以,这里有一些建议:
减少图像尺寸(输入数据)。特别是,您应该尝试沿每个维度将它们的大小除以2,计算流量,然后使用线性插值计算全尺寸流量。除非您的应用程序需要非常高的准确性,否则此解决方案应该是可接受的,并且会为您带来巨大的加速。
减少每个比例的经线数(参数:warps
)。这会对精度造成一定的伤害,但除非您有非常困难的运动模式(例如,当所有图像像素在不同方向上移动时,或者当您在图像内部进行非常快速的运动时),结果仍然是可接受的。算法在图像金字塔中每个级别运行最小化过程warps
次,因此即使warps
中的一个小变化也会给你一个明显的加速。
降低图片金字塔中的级别数(参数:scales
)。这可能会对准确性产生重要影响,因此请务必小心并进行大量实验。在文献中已经发现,水平之间的良好(准确性)比例因子是0.8,因此您应该相应地计算您的水平数。在0.8之前,实验光流的标准是0.5的比例因子,所以你可以尝试下降到这个值。
收敛速度:理论上,L1最小化的内部程序对于时间步长(参数:tau
)最高可达1/8(0.125),但实际值为1/4(0.25) )已知仍然有效。