我有一个项目,我需要检测视频流中的运动。当检测到运动时,进行进一步的处理。不需要检测检测到运动的区域或更详细的信息。我只需要测量两个图像或类似触发器之间像素变化的百分比,以进行进一步处理。
我的想法是取两张图像的绝对差异,将其阈值并计算像素。我使用cv::absdiff,cv::threshold和cv::countNonZero。对于全高清图像,此计算大约需要10毫秒。在30fps时,这在单个内核上加起来为10 * 30 =300ms。
这还不包括图像的灰度转换,与差异图像计算相比,灰度转换大约需要2-3倍。所以我可以在一个内核上处理大约10fps的全高清图像。
我现在正在寻找一种方法来显著提高灰度转换/运动检测的速度。就计算能力而言,在RGB视频流中进行运动检测的最快方法是什么?
发布于 2014-06-30 23:44:49
如果你完全被限制在一个核心上,这就不适用了。但是,如果您有一个良好的视频卡,您可以使用gpu::或ocl::函数。通过使用这些,你可以将操作速度提高3-30倍!我知道一个事实,gpu::threshold比cpu版本快得多。在geForce gtx660上,我可以在0.001秒内处理一张1080p的图片。在相同大小的图像上我的图形处理时间的进一步例子:掩蔽- .002,LBP分类- .053,形态学.002。
发布于 2014-07-01 02:38:06
opencv提供了比较mats的方法,例如,cv::compare重载了relative运算符。
此外,在调试opencv库和发行库之间的速度方面有一个巨大的差异,在这一点上,在你担心速度之前,使用opencv的发行库进行发布编译。
https://stackoverflow.com/questions/24492762
复制相似问题