opencv - 车辆分割和跟踪

标签 opencv tracking classification image-segmentation object-detection

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

所以我一直在考虑尝试从背景中分割汽车以找到大致位置,以便在应用我的分类器之前减少搜索空间,但我不知道如何解决这个问题,希望有人能提供帮助?

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

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

第 0 帧:
enter image description here

第 5 帧:
enter image description here

最佳答案

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

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

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

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

更新

I was wondering if you could expand on how you would go about looking for clusters of pixels that don't move according to the estimated homography?



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

为了在 Diff 中聚类高误差像素组,我将从简单的阈值开始(“Diff 中大于 X 的每个像素差异都是相关的”,可能使用自适应阈值)。阈值图像可以通过形态学操作(膨胀、侵 eclipse )进行清理,并与连接的组件进行聚类。这可能太简单了,但第一次尝试很容易实现,而且应该很快。对于更花哨的东西,请查看 Clustering in Wikipedia 。 2D Gaussian Mixture Model 可能很有趣;当您使用前一帧的检测结果对其进行初始化时,它应该非常快。

我对你提供的两个框架做了一些实验,我不得不说我自己有点惊讶它的效果如何。 :-) 左图: 您发布的两帧之间的差异(颜色编码)。 右图: 用单应性匹配后帧之间的差异。剩下的区别显然是移动的汽车,它们足够强大以进行简单的阈值处理。

想想你目前使用的方法,把它和我的建议结合起来可能很有趣:
  • 您可以尝试在差异图像 D 中而不是原始图像中学习和分类汽车。这相当于学习汽车运动模式的样子,而不是汽车的样子,后者可能更可靠。
  • 您可以摆脱昂贵的窗口搜索,只在 D 具有足够高值的区域上运行分类器。

  • 一些补充说明:
  • 理论上,如果汽车不移动,它们甚至应该很突出,因为它们不是平的,但是考虑到您与场景的距离和相机分辨率,这种效果可能太微妙了。
  • 如果你愿意,你可以用 光流 替换我提议的特征提取/匹配部分。这相当于识别从地面一致的帧到帧运动“突出”的流向量。然而,它可能容易在光流中出现异常值。您也可以尝试从流向量中获取单应性。
  • 这很重要: 无论您使用哪种方法,一旦您在一个帧中找到汽车,您就应该使用此信息来加强您在连续帧中对这些汽车的搜索,从而提高检测到旧汽车的可能性(卡尔曼滤波器等)。这就是跟踪的全部意义所在!
  • 关于opencv - 车辆分割和跟踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15392272/

    相关文章:

    python - 支持向量机算法: Without using sklearn package (Coded From the Scratch)

    machine-learning - 为什么我需要在迁移学习中预先训练权重

    python - 有什么方法可以更改 imshow() 窗口的图标吗?

    python - 在 python 中安装和导入模块的问题

    ios - iOS 中的 Google Analytics,我如何知道我的网站页面是否是使用应用程序打开的?

    c++ - OpenCV : Object detection and tracking based on feature detection

    c++ - 使用 OpenCV 凸包和凸缺陷函数的手指跟踪/计数

    CvCreateMatND 直接访问

    c++ - openCV 创建不同大小的 3D 矩阵

    machine-learning - 概率和神经网络