如何在静态图像opencv c ++中执行canny edge之后识别汽车

时间:2013-09-14 13:58:07

标签: c++ opencv

我是OpenCV的新手,我想知道如何在一张精巧的图像中识别汽车 因为我想根据它们的边缘来计算图像中的汽车。

这是canny edged图像

canny edged cars

这是原始图片

original image

2 个答案:

答案 0 :(得分:1)

使用background subtraction可以解决在给定场景中识别动态对象的一般问题,例如计数等。

这个想法是使用OpenCV提供的这种技术的一种实现,例如BackgroundSubtractorMOG,通过提供视频流的每一帧来为它构建场景的背景模型。它将识别场景的哪些特征最可能是静态的,以构建最可能背景的合成图像,在您的情况下没有汽车的停车场。然后,您将从此syntetic背景中减去给定的帧,并计算具有最小大小的 blobs ,即大到足以成为车辆。

结果令人印象深刻,我特别喜欢这种技巧。在youtube上,您可以查看一些示例,我建议this one,这与您的特定情况非常接近。 This one here也非常有趣,因为它与当前帧并排显示同步背景图像,因此您可以看到它的工作原理。在最后一个视频的00:50附近密切关注,你可以在背景图片上慢慢看到出现,因为它在同一个地方停留的时间太长了。

答案 1 :(得分:1)

人类不善于发现事物吗?你甚至可以识别出canny边缘图像中的汽车,即使没有一个轮子可见。

无论如何,你使用canny边缘检测的主要原因是因为你有一个每秒10-100百万像素的数据流。你需要在那里快速找到有趣的位。正如你的图像所示,它的作用非常棒。

现在,为了计算停车位中的实际车辆,我会建议一个固定的设置程序来识别潜在的停车位。无论如何,你不想算过往车。通过检查canny图像中的并行线组,可以使此步骤半自动化。

一旦确定了停车位,定义一个面罩可能是个好主意。使用此蒙版将非停车点像素归零。 (在精确边缘检测之前执行此操作也会加速该过程,但显然会在蒙版周围添加假边缘,因此您必须重新应用蒙版。)

现在它只是检查停车位是否有足够大的东西。你可能不在乎摩托车是否算作汽车。为此,请使用canny边缘将汽车像素与周围的停车场像素分开,并计算它们是否不同(颜色/亮度/纹理/...)