假设您的汽车正在移动,您可以尝试估计地平面(道路)。
您可以通过提取特征(SURF 而不是 SIFT,用于速度)、在帧对上匹配它们并使用 RANSAC 求解单应性来获得下降地平面估计,因为 3d 中的平面根据两个相机帧之间的单应性移动。
有了地平面后,您可以通过查看根据估计的单应性不移动的像素簇来识别汽车。
一种更复杂的方法是在地形上从运动中构建结构。这只是假设它是刚性的,而不是它是平面的。
更新
我想知道您是否可以扩展如何根据估计的单应性寻找不移动的像素簇?
当然。说I
和K
是两个视频帧,H
是 中的单应性映射特征I
到特征K
。首先,您根据I
变形,即您将变形图像计算为(大致 Matlab 表示法)。然后您查看平方或绝对差值图像。根据单应性移动的图像内容应该给出小的差异(假设图像之间的照明和曝光恒定)。违规的图片内容(例如移动的汽车)应突出显示。K
H
Iw
Iw( [x y]' )=I( inv(H)[x y]' )
Diff=(Iw-K)*(Iw-K)
H
H
对于聚类中的高错误像素组,Diff
我将从简单的阈值处理开始(“Diff
大于 X 的每个像素差异都是相关的”,可能使用自适应阈值)。阈值图像可以通过形态学操作(膨胀、腐蚀)进行清理,并与连接的组件进行聚类。这可能过于简单,但第一次尝试很容易实现,而且应该很快。如需更花哨的内容,请查看Wikipedia 中的 Clustering。二维高斯混合模型可能很有趣;当您使用前一帧的检测结果对其进行初始化时,它应该非常快。
我对您提供的两个框架做了一个小实验,我不得不说我自己对它的效果感到有些惊讶。:-)左图:您发布的两帧之间的差异(颜色编码)。右图:将它们与单应性匹配后的帧之间的差异。其余的差异显然是移动的汽车,它们对于简单的阈值处理来说足够强大。
考虑到您目前使用的方法,将它与我的建议结合起来可能会很有趣:
- 您可以尝试在差异图像
D
而不是原始图像中学习和分类汽车。这相当于学习汽车运动模式的样子,而不是汽车的样子,这可能更可靠。
- 您可以摆脱昂贵的窗口搜索并仅在
D
具有足够高值的区域上运行分类器。
一些补充说明:
- 从理论上讲,如果汽车不移动,它们甚至应该脱颖而出,因为它们不是平坦的,但考虑到您与场景的距离和相机分辨率,这种效果可能过于微妙。
- 如果你愿意,你可以用Optical Flow替换我提案中的特征提取/匹配部分。这相当于识别从地面的一致帧到帧运动中“突出”的流向量。然而,它可能容易在光流中出现异常值。您还可以尝试从流向量中获取单应性。
- 这很重要:无论您使用哪种方法,一旦您在一帧中找到汽车,您应该使用此信息来加强您在连续帧中对这些汽车的搜索,从而为接近旧的检测提供更高的可能性(卡尔曼滤波器, ETC)。这就是跟踪的全部意义所在!