加速光流(createOptFlow_DualTVL1)

Dav*_*ave 7 opencv opticalflow

createOptFlow_DualTVL1()用来计算光流量,它正是我想要的,但它非常慢.有什么方法可以加快它的速度,还是有任何其他光流功能可以给我相同的结果,减少处理时间?我用过calcOpticalFlowFarneback(), cvGoodFeaturesToTrack()但质量不好.请帮忙.

提前谢谢以下是我的申请方式 createOptFlow_DualTVL1()

Ptr<DenseOpticalFlow> tvl1 = createOptFlow_DualTVL1();
tvl1->calc(Previous_Gray_Frame, Current_Gray_Frame, Optical_Flow);
Run Code Online (Sandbox Code Playgroud)

san*_*iso 12

为了加快计算速度,您需要减少每次执行的计算总次数.这看起来很明显,但实现这一目标的大量策略可能令人困惑.所以,这里有一些建议:

  1. 减小图像大小(输入数据).特别是,您应该尝试沿每个维度将它们的大小除以2,计算流量,然后使用线性插值计算全尺寸流量.除非您的应用程序需要非常高的准确性,否则此解决方案应该是可接受的,并且会为您带来巨大的加速.

  2. 减少每个比例的扭曲数(参数:)warps.这会损害一点精度,但除非您有非常困难的运动模式(例如,当所有图像像素在不同方向上移动时,或者当您在图像内部进行非常快速的运动时),结果仍然是可接受的.算法运行warps图像金字塔中每个级别的最小化过程时间,因此即使很小的变化warps也会给你一个明显的加速.

  3. 减少图像金字塔中的级别数(参数:) scales.这可能会对准确性产生重要影响,因此请务必小心并进行大量实验.在文献中已经发现,水平之间的良好(准确性)比例因子是0.8,因此您应该相应地计算您的水平数.在0.8之前,实验光流的标准是0.5的比例因子,所以你可以尝试下降到这个值.

  4. 收敛速度:L1最小化的内部程序tau在理论上对于时间步长(参数:)高达1/8(0.125)是稳定的,但实际上已知1/4(0.25)的值仍然有效.

  • 谢谢你的帮助.如果我可以添加一些修正:tvl1-> getDouble("theta"); //得到值tvl1-> set("theta",0.125); //设置值 (2认同)