我正在研究基于无人机的视频监控项目。我需要在同一个实现对象跟踪。我尝试过传统方法,但由于非静态环境,这些方法似乎失败了。
This is an example我希望实现的目标。但这使用背景减法,这是非静态相机无法实现的。
我还尝试使用SURF features进行基于功能的跟踪,但是对于较小的对象,它会失败,并且容易出现误报。
在这种情况下实现目标的最佳方法是什么?。
编辑:对象可以是定义的感兴趣区域内的任何内容。物体通常是人或车辆。这个想法是用户将创建一个定义感兴趣区域的边界框。无人机现在必须开始跟踪这个感兴趣区域内的任何东西。
答案 0 :(得分:4)
跟踪本地功能(如SURF)在您的情况下无法正常工作。训练分类器(如具有HAAR功能的Boosting)也不会起作用。让我解释一下原因。
您要跟踪的对象将包含在边界框中。在这个边界框内可以有任何对象,而不是人, car ,或者你用来训练分类器的其他东西。
此外,在对象附近,在边界框中,即使对象的外观没有改变,也会在目标对象移动时立即改变背景噪声。 此外,你的物体的外观会发生变化(例如,一个人转身,或者掉下夹克,车辆会得到太阳的反射等等),或者物体会被(部分或全部)遮挡一段时间。因此,跟踪本地功能很可能很快就会丢失跟踪对象。
所以第一个问题是你必须处理潜在的许多不同的对象,可能是未知的,以便跟踪,你不能为每一个训练分类器。
第二个问题是您必须关注外观可能会发生变化的对象,因此您需要更新模型。
第三个问题是您需要一些逻辑来告诉您丢失了跟踪对象,并且需要在场景中再次检测到它。
那该怎么办?好吧,你需要一个好的长期跟踪器。
最好的(据我所知)是Kalal et. al.的跟踪学习检测(TLD)。您可以在专用page上看到很多示例视频,您可以看到它在移动相机,改变外观的对象等方面效果很好......
幸运的是,OpenCV 3.0.0有TLD的实现,您可以找到示例代码here(前面提到的站点中还有一个Matlab + C实现)。
主要缺点是这种方法可能很慢。您可以测试它是否适合您。如果是这样,您可以对视频流进行缩减采样,升级硬件或切换到更快的跟踪方法,但这取决于您的要求和需求。
祝你好运!答案 1 :(得分:0)
最简单的尝试是帧差异而不是背景减法。从当前帧中减去前一帧,将差值图像阈值化为二进制,然后使用一些形态来清除噪声。使用这种方法,您通常只能获得对象的边缘,但通常这足以进行跟踪。
你也可以尝试使用vision.PointTracker
来增强这种方法,它实现了KLT(Kanad-Lucas-Tomasi)点跟踪算法。
或者,您可以尝试使用密集光流。请参阅opticalFlowLK,opticalFlowHS和opticalFlowLKDoG。