我有一个ConcurrentQueue,正在填充图像流。为简单起见,假设它们是来自网络摄像头的帧。
我最理想的是检测
据推测,我需要在最后N帧中合成参考图像(以便考虑半永久性变化,例如白天/夜晚,停放的汽车等......)然后将当前帧与参考帧区分开来。
帧具有(最小)噪声水平,因此精确的颜色比较不是可行的选择。
我确信我之前已经看过这方面的教程(最终在大片活动区域的“盒子”),但我现在找不到它们。
有人能指出我一个不错的算法/教程吗?
答案 0 :(得分: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
一旦你有轮廓,你也可以找到边界矩形,如果这更符合你的目的。
这不是完美的,在调试或优化时,您必须在每一步之后显示输出,以确定哪些是正常的,哪些是不正确的。花一些时间构建基础架构以使其更容易。一旦你有源数据和大多数工作流程调整来获得你想要的结果是非常可行的。