4

我一直在从事一个项目,在从无人机捕获的视频中检测和跟踪(移动)车辆,目前我正在使用一个支持向量机,该 SVM 训练了从车辆和背景图像中提取的局部特征的特征袋表示。然后,我使用滑动窗口检测方法来尝试定位图像中的车辆,然后我想对其进行跟踪。问题是这种方法速度很慢,而且我的检测器不像我想要的那样可靠,所以我得到了很多误报。

所以我一直在考虑尝试从背景中分割汽车以找到大致位置,以便在应用我的分类器之前减少搜索空间,但我不知道该怎么做,希望有人能帮忙?

另外,我一直在阅读有关使用层的运动分割,使用光流按流模型分割帧的内容,是否有人对这种方法有任何经验,如果有的话,您能否提供一些输入,以说明您是否认为这种方法适用于我的问题。

下面是来自示例视频的两帧

第 0 帧: 在此处输入图像描述

帧 5: 在此处输入图像描述

4

2 回答 2

11

假设您的汽车正在移动,您可以尝试估计地平面(道路)。

您可以通过提取特征(SURF 而不是 SIFT,用于速度)、在帧对上匹配它们并使用 RANSAC 求解单应性来获得下降地平面估计,因为 3d 中的平面根据两个相机帧之间的单应性移动。

有了地平面后,您可以通过查看根据估计的单应性不移动的像素簇来识别汽车。

一种更复杂的方法是在地形上从运动中构建结构。这只是假设它是刚性的,而不是它是平面的。


更新

我想知道您是否可以扩展如何根据估计的单应性寻找不移动的像素簇?

当然。说IK是两个视频帧,H是 中的单应性映射特征I到特征K。首先,您根据I变形,即您将变形图像计算为(大致 Matlab 表示法)。然后您查看平方或绝对差值图像。根据单应性移动的图像内容应该给出小的差异(假设图像之间的照明和曝光恒定)。违规的图片内容(例如移动的汽车)应突出显示。KHIwIw( [x y]' )=I( inv(H)[x y]' )Diff=(Iw-K)*(Iw-K)HH

对于聚类中的高错误像素组,Diff我将从简单的阈值处理开始(“Diff大于 X 的每个像素差异都是相关的”,可能使用自适应阈值)。阈值图像可以通过形态学操作(膨胀、腐蚀)进行清理,并与连接的组件进行聚类。这可能过于简单,但第一次尝试很容易实现,而且应该很快。如需更花哨的内容,请查看Wikipedia 中的 Clustering。二维高斯混合模型可能很有趣;当您使用前一帧的检测结果对其进行初始化时,它应该非常快。

我对您提供的两个框架做了一个小实验,我不得不说我自己对它的效果感到有些惊讶。:-)左图:您发布的两帧之间的差异(颜色编码)。右图:将它们与单应性匹配后的帧之间的差异。其余的差异显然是移动的汽车,它们对于简单的阈值处理来说足够强大。

图像对齐前后的帧差

考虑到您目前使用的方法,将它与我的建议结合起来可能会很有趣:

  • 您可以尝试在差异图像D而不是原始图像中学习和分类汽车。这相当于学习汽车运动模式的样子,而不是汽车的样子,这可能更可靠。
  • 您可以摆脱昂贵的窗口搜索并仅在D具有足够高值的区域上运行分类器。

一些补充说明:

  • 从理论上讲,如果汽车不移动,它们甚至应该脱颖而出,因为它们不是平坦的,但考虑到您与场景的距离和相机分辨率,这种效果可能过于微妙。
  • 如果你愿意,你可以用Optical Flow替换我提案中的特征提取/匹配部分。这相当于识别从地面的一致帧到帧运动中“突出”的流向量。然而,它可能容易在光流中出现异常值。您还可以尝试从流向量中获取单应性。
  • 这很重要:无论您使用哪种方法,一旦您在一帧中找到汽车,您应该使用此信息来加强您在连续帧中对这些汽车的搜索,从而为接近旧的检测提供更高的可能性(卡尔曼滤波器, ETC)。这就是跟踪的全部意义所在!
于 2013-03-13T18:02:47.993 回答
1
  1. 如果您视野中的汽车数量始终保持不变但四处移动,那么您可以使用光流...它会在静止背景下为您提供良好的结果...如果汽车数量在变化,那么您需要在一定数量的帧后调用 OpenCV 中的 goodFeaturestoTrack 函数,并再次使用光流跟踪汽车。
  2. 您可以使用背景建模来建模背景,因此汽车始终是您的前景。最简单的示例是帧区分...减去前一帧当前帧。diff(x,y,k) = I(x,y,k) - I(x,y,k-1).当您的汽车在每一帧中移动时,您将获得它们的位置..
  3. 这两个过程都可以正常工作,因为我认为你有一个静止的背景。检查这个链接以找到光流可以做什么。
于 2013-03-14T01:49:50.610 回答