【问题标题】:Realtime motion detection using OpenCV使用 OpenCV 进行实时运动检测
【发布时间】:2014-08-20 23:31:34
【问题描述】:

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

我的想法是获取两个图像的绝对差异,对其进行阈值化并计算像素。我正在使用 cv::absdiff、cv::threshold 和 cv::countNonZero。对于全高清图像,此计算大约需要 10 毫秒。在 30 fps 时,这在单个内核上加起来为 10 * 30 = 300 ms。

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

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

【问题讨论】:

    标签: opencv real-time detection motion


    【解决方案1】:

    如果您完全受限于单核,则不适用。但是,如果你有一块好的显卡,你可以使用 gpu:: 或 ocl:: 函数。通过使用这些,您可以将操作速度提高 3-30 倍!我知道 gpu::threshold 比 cpu 版本快得多。我可以在 geForce gtx660 上在 0.001 秒内对 1080p 图片进行脱粒。 我在相同尺寸图像上的 GPU 时间的更多示例: 掩蔽 - .002, LBP 分类 - .053, 形态学.002.

    【讨论】:

    • 我不受限于单核。相对于单个 CPU 的计算可以为我自己指示我可以并行运行多少个实例。 gpu:: 仅支持 nvidia 设备。我被一些英特尔 gpu 卡住了,所以只有 ocl:: 可供我使用。将我的图像数据复制到 gpu 内存需要多长时间?
    【解决方案2】:
    1. 在处理之前缩小图像大小
    2. 在测试前应用模糊,因为这会降低噪点。

    opencv 具有将垫子比较在一起的方法,例如cv::compare 重载了相关运算符。

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

    【讨论】:

      猜你喜欢
      • 2012-12-08
      • 1970-01-01
      • 1970-01-01
      • 2017-11-09
      • 1970-01-01
      • 2020-03-22
      • 1970-01-01
      • 2014-03-13
      • 1970-01-01
      相关资源
      最近更新 更多