我需要计算从头顶相机记录的两个连续帧之间的车辆的密集光流。我在Python中使用对象检测器进行车辆检测,使用Farneback算法进行光流估计。目前,光流是针对整个图像进行计算的。但是,我需要在检测到的车辆周围创建一个遮罩,并仅在选定区域周围计算密集的光流。这将有助于显著加快光流估计。我也可以使用任何其他形式的密集光流估计,但不能使用稀疏光流(例如,Lucas-Kanade方法)。一种选择是提取车辆区域并单独输入每个车辆区域进行光流估计,但我正在寻找更好的解决方案。
flow = cv2.calcOpticalFlowFarneback(prvs,next, None, 0.5, 3, 15, 3, 5, 1.2, 0)
对于没有任何光流计算的非车辆掩蔽区域,预期的光流结果将为零。
发布于 2019-09-28 04:37:53
不幸的是,通过屏蔽或只提供检测器的边界框来加速您计划的运动估计将不是一个好主意。如果使用密集光流方法,则需要提供整个图像并计算整个图像的流场。如果你通过移除来覆盖图像,你会引入人为的边缘,这会使方法变得混乱。另一方面,单独输入每个车辆区域将失去密集流方法计算更大(快速)运动的能力。farneback等方法使用图像金字塔来处理大型运动,即它们基于缩小输入图像的比例。如果区域太小,这将限制计算大型运动的能力。一种减少运行时间的可能性是应用稀疏方法,例如(Lucas Kanade或RLOF),并将SparseToDense插值(例如,OpenCV中的EdgeAwareInterpolation )应用于车辆区域,并获得该区域的密集运动场。
发布于 2019-09-29 16:14:19
对于光流的某些用例,这可能是一种健康的加速方法。
为了确保我们在同一页面上,光流不会直接用作跟踪汽车的主要信息源。由另一个模块处理。可能是一些基于深度学习的目标检测器。这个对象检测器可能是计算密集型的(除非你有一些特殊的硬件,比如专用的GPU或VPU)。
密集的流可以是一个很好的补充,以获得关于汽车及其周围正在发生的事情的低延迟信息,并且可以用作引导后面的检测器的一部分(在连续的帧中提供在检测器之前,就像在卡尔曼滤波器跟踪某种设置中一样)。
有了这个假设,您就可以轻松地优化您提到的光流计算。我建议你在这里跳过密集遮罩的概念,只需使用检测器的边界框即可。这将是流量计算的感兴趣区域。如果您位于第t帧,也就是您的检测所在的位置,并且希望使用来自两个帧t和t-1的光流,则对这两个帧使用相同的边界框。这将为您提供2个ROI,这些ROI将馈送到您的密集光流模块。
每种光流算法都有用于其低级操作的支持区域,并且它们都不能很好地处理图像边界。因此,请确保为边界框提供足够的额外空间(只要它们适合原始视频帧)。
为清楚起见,如果汽车检测的边界框为bbox(x,y,w,h),则需要良好的边距m,以便用于密集流的边界框为bbox(x-m/2,y-m/2,w+m,h+m)。边距是您希望根据光流方法(及其参数)进行设置的内容。
编辑:在这里为你编写代码,你可以去。注意,我根本没有测试过这个:
// This is c++, since we are talking optimizations
// I am uncertain of they python wrappers, but below I am fairly certain
// will not make any deep copies outside of the flow module.
// Assume you have INew and IOld, the two frames of the video:
// assume your bounding box from your detector is a cv::Rect b
float m = 4.0; // 4 pixels as an example margin...
Rect boxFlow(b.x - m/2, b.y - m/2, b.width + m, b.height + m);
Mat roiNew(INew (boxFlow));
Mat roiOld(IOld (boxFlow));
Mat uflow;
calcOpticalFlowFarneback(roiOld, roiNew, uflow, 0.5, 3, 15, 3, 5, 1.2, 0);
但是,根据您的设置,这最终可能不会有显著的速度提升。对于上面的代码,我不知道内存是如何在flow模块中处理的,在您的python版本中,我甚至不确定它将如何处理。
考虑一下,在一种简化的密集光流方法中(在整个输出中使用相同大小的数据),您的流水线中具有相同大小的内存缓冲区。您提到的方法的简单实现将需要动态分配内存,因为边界框的大小和数量将随着时间的推移而变化。
https://stackoverflow.com/questions/56878219
复制相似问题