使用OpenCV进行实时运动检测

时间:2014-06-30 14:42:20

标签: opencv real-time detection motion

我有一个项目需要检测视频流中的动作。当检测到运动时,进行进一步的处理。不需要检测检测到运动的区域或更详细的信息。我只需要测量两个图像之间的像素变化百分比或类似触发器的进一步处理。

我的想法是采取两个图像的绝对差异,阈值和计数像素。我使用cv :: absdiff,cv :: threshold和cv :: countNonZero。对于全高清图像,该计算大约需要10毫秒。在30 fps时,单核上的加起来为10 * 30 = 300 ms。

这还没有包括图像的灰度转换,与差异图像计算相比,这需要大约2-3倍。所以我可以在一个核心上处理大约10 fps的全高清。

我现在正在寻找一种以显着方式加速灰度转换/运动检测的方法。在计算能力方面,RGB视频流中最快的运动检测方式是什么?

2 个答案:

答案 0 :(得分:1)

如果您完全受限于单个核心,则不适用。但是,如果你有一个好的视频卡,你可以使用gpu ::或ocl :: functions。通过使用这些,您可以加快操作3-30倍!我知道gpu :: threshold比cpu版本快得多。我可以在geForce gtx660上以0.001秒的速度打印1080p图片。 我在同一尺寸图像上的GPU时间的更多示例: 掩蔽 - .002, LBP分类 - .053, 形态学.002。

答案 1 :(得分:1)

  1. 处理前调整图像大小
  2. 在测试前应用模糊,因为这会降低噪音。
  3. opencv具有将垫子比较在一起的方法,例如cv :: compare,它重载了相对运算符。

    此外,在调试opencv库和发布库之间的速度方面存在巨大差异,在您担心速度之前,使用opencv的发布库进行发布编译。