基于OpenCV的实时运动检测

基于OpenCV的实时运动检测,opencv,real-time,detection,motion,Opencv,Real Time,Detection,Motion,我有一个项目,我需要检测视频流中的运动。当检测到运动时,将执行进一步的处理。不需要检测检测到运动的区域或更详细的信息。我只需要测量两幅图像或类似图像之间像素变化的百分比,作为进一步处理的触发器 我的想法是取两幅图像的绝对差值,设置阈值并计算像素数。我使用的是cv::absdiff、cv::threshold和cv::countNonZero。对于全高清图像,此计算大约需要10毫秒。在30 fps的速度下,单芯上的总速度为10*30=300 ms 这还不包括图像的灰度转换,这大约是差分图像计算的2

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

我的想法是取两幅图像的绝对差值,设置阈值并计算像素数。我使用的是cv::absdiff、cv::threshold和cv::countNonZero。对于全高清图像,此计算大约需要10毫秒。在30 fps的速度下,单芯上的总速度为10*30=300 ms

这还不包括图像的灰度转换,这大约是差分图像计算的2-3倍。所以我可以在一个内核上处理10 fps的全高清视频


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

如果完全局限于单个核心,则不适用。但是,如果您有一个好的视频卡,您可以使用gpu::或ocl::函数。通过使用这些,您可以将操作速度提高3-30倍!我知道gpu::threshold比cpu版本快得多。在geForce gtx660上,我可以在0.001秒内对1080p图片进行脱粒。 我的GPU时间在相同大小图像上的其他示例: 掩蔽-0.002, LBP分类-.053, 表1.002

  • 在处理之前,请向下调整图像的大小
  • 在测试前应用模糊,因为这样可以减少噪音
  • opencv有将mats比较在一起的方法,例如cv::compare,它重载了相关运算符


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

    我不局限于单个核心。相对于单个CPU的计算可以为我自己指示可以并行运行多少实例。gpu::仅支持nvidia设备。我被一些英特尔gpu卡住了,所以只有ocl::对我可用。将图像数据复制到gpu内存需要多长时间?