如何跟踪流中图像之间的运动

Posted

技术标签:

【中文标题】如何跟踪流中图像之间的运动【英文标题】:How to track motion between images in a stream 【发布时间】:2012-12-03 21:32:59 【问题描述】:

我有一个 ConcurrentQueue 正在填充图像流。为简单起见,假设它们是来自网络摄像头的帧。

我最想做的是检测

如果有任何动作 最大(按大小而非速度)运动在帧中的位置 第二大运动在帧中的位置

大概我需要在最后 N 帧上合成参考图像(以便考虑半永久性变化,例如白天/夜晚、停放的汽车等),然后将当前帧与参考帧进行区分。

帧具有(最小)噪声水平,因此精确的颜色比较不是一个可行的选择。

我确定我之前已经看过这方面的教程(最终出现在大范围运动区域的“盒子”中),但我现在找不到它们。

有人能指点我一个像样的算法/教程吗?

【问题讨论】:

这个问题嵌入了很多问题,而且范围太大了。这是一个非常简单的方法来帮助您开始第一个要点:使用像 Pearson 相关系数 (PCC) 这样简单的方法。为此,基本方法是:初始帧作为基础帧开始。然后对于每个新框架,您计算它与基本框架之间的 PCC,如果结果大于某个阈值,那么您调查这个新框架中可能的修改并将其设置为新的基本框架。重复整个视频。 @mmgp 我没有意识到它是如此广泛?不管怎样,谢谢你的信息,我会读一读。 我总是从多种可能的情况中处理成像任务,因此它们自然是广泛的。由于我在您的帖子中没有看到任何类型的限制,因此按照我的标准,它们是广泛的。例如,在您的帖子中,您说“如果有任何动议”,这是非常广泛的。您可能想忽略“噪声变化”,但是在您未知输入的情况下,“噪声变化”究竟是什么?尝试检测运动变化的方法有很多,可以从前面提到的 PCC 的简单方法开始。此外,还有色彩空间的事实。您可能不想使用 RGB。我会继续,按空格是- 很公平。这是从建筑物内部向停车场拍摄的一系列图像。我希望能够检测到有人走过并估算他们的位置。所以......忽略来自相机的噪音,忽略像灌木丛这样的小动作。忽略像白天/黑夜这样的随时间变化,但会检测到像人这样的大而快速的运动。灰度也很好,我可以转换图像。这有帮助吗? 我不确定它是否有帮助,您是否尝试过 PCC 并没有达到您想要的效果? 【参考方案1】:

如果您只想要一个可行的解决方案,ZoneMinder 或 Motion 是两个使用 video4linux 接口在 linux 下运行的软件。

如果您出于某种原因需要自行开发,您可以使用很多技术或策略。您所概述的内容基本上处于正确的轨道上。不过,您遗漏了一些重要的细节。

    由于相机是静止的,请记录最后 N 帧作为您的“背景”图像。对它们进行平均。

    http://opencv.willowgarage.com/documentation/cpp/imgproc_motion_analysis_and_object_tracking.html

    从当前图像中减去背景。你剩下的我们称之为前台。

    http://opencv.willowgarage.com/documentation/cpp/core_operations_on_arrays.html#cv-absdiff

    可以选择执行膨胀或腐蚀(或两者兼有)以消除噪声或连接近似连接区域。

    http://opencv.willowgarage.com/documentation/image_filtering.html#dilate

    对前景图像设置阈值以确定哪些重要,哪些不重要。

    http://docs.opencv.org/doc/tutorials/imgproc/threshold/threshold.html

    可选地使用 findContours 函数来获取“移动”的描述

    http://docs.opencv.org/doc/tutorials/imgproc/shapedescriptors/find_contours/find_contours.html

    一旦你有了轮廓,你还可以找到边界矩形,如果这就是你想要的。

    http://opencv.willowgarage.com/documentation/python/structural_analysis_and_shape_descriptors.html#boundingrect

这并不完美,在调试或优化时,您必须在每一步之后显示输出,以确定哪些工作正常,哪些工作不正常。花一些时间构建基础设施以使这更容易。一旦你有了源数据和大部分工作管道调整以获得你想要的结果是完全可行的。

【讨论】:

对不起,迈克,我在想一个相关的不同问题。你说得很对,谢谢。我自己已经设法解决了很多上述问题,但你做得很好

以上是关于如何跟踪流中图像之间的运动的主要内容,如果未能解决你的问题,请参考以下文章

如何在opencv中使用光流跟踪来分割图像?

行中图像的动态列表,带有换行符(之间没有空格),允许长按图像打开编辑选项 - Flutter

HTML电子邮件中图像之间的垂直间距

OpenCV中图像直方图与应用

如何获取相册中图像的图像文件名和标签?

Pygame中图像和矩形之间的碰撞检测?