2012-12-03 19 views
1

我有一个正在填充图像流的ConcurrentQueue。为了简单起见,假设他们是来自网络摄像头的帧。如何跟踪流中图像之间的移动

我会非常喜欢做的是检测

  • 如果有一个在所有
  • 其中最大(按大小而不是速度)任何运动运动是在框架
  • 凡第二大运动是在帧

推测我需要合成参考图像在过去的N个帧(使得半永久性改变占例如日/夜,停放的汽车,等等),然后各色从参考帧中获取当前帧。

帧具有噪声的(最小)电平,从而精确的颜色对比是不是一个可行的选择。

我敢肯定,我之前(最终在一个“盒子”周围大面积的运动)已经看到了这个教程,但现在我无法找到他们。

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

+0

这个问题上嵌入了很多问题,其范围太大。这里有一个非常简单的方法可以让你开始使用第一个重点:使用像Pearson相关系数(PCC)那样简单的方法。为此,基本方法是:初始帧作为基本帧开始。然后,对于每个新帧,计算它与基本帧之间的PCC,如果结果大于某个阈值,则调查此新帧中的可能修改并将其设置为新的基本帧。重复整个视频。 – mmgp

+0

@mmgp我没有意识到它是如此广泛?无论如何,谢谢你的信息,我会读一读。 – Basic

+0

我总是从多种可能情况下拍摄影像任务,所以它们自然宽泛。由于我的帖子中没有看到任何形式的限制,因此我的标准很宽泛。例如,在你的文章中,你会说“如果有任何动作”,这是非常广泛的。你会想忽略“噪音变化”,但给出你未知的输入究竟是“噪音变化”?尝试检测运动变化的方法有很多,可以从PCC的简单方法开始,如前所述。此外,还有色彩空间的事实。你可能不想使用RGB。我会继续,由空间是 - – mmgp

回答

1

如果你只是想一个可行的解决方案,ZoneMinder或运动是两个软件,使用的Video4Linux接口linux下运行。

如果您因为某种原因需要推出自己的产品,则可以使用许多技巧或策略。你基本上已经走上了正确的轨道。你错过了一些重要的细节。

  1. 由于摄像机是静止的,请记录最后N帧作为“背景”图像。平均他们所有。

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

  2. 减去从当前图像的背景。你留下的我们将称之为前景。

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

  3. 可选地执行扩张或侵蚀(或两者),以去除噪声或加入几乎连接区域。

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

  4. 阈值的前景图像,以确定什么是重要的,什么不是。

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

  5. 可以选择使用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

这会不会是完美的,在调试或优化时,你必须表明,每一步后输出到弄清楚发生了什么工作的权利,什么不是。花一些时间构建基础设施以使其更容易。一旦你有源数据和大部分的工作流水线调整,以获得你想要的结果是非常可行的。

+0

对不起,迈克,我想的是一个不同的问题,这是相关的。你很对,谢谢。我已经设法解决了上面的很多问题,但是你很震惊 – Basic