1

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

我最想做的是检测

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

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

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

我敢肯定我以前看过这方面的教程(最终形成一个围绕大面积运动的“盒子”),但我现在找不到它们。

有人可以指出一个像样的算法/教程吗?

4

1 回答 1

1

如果您只是想要一个可行的解决方案,ZoneMinder 或 Motion 是两个使用 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/shapeescriptors/find_contours/find_contours.html

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

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

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

于 2012-12-11T04:18:51.013 回答