我试图使用这种方法来检测移动物体.有人可以为此建议我吗?
Im trying to use this method to detect moving object. Can someone advise me for this?
我想
问一下,如果我使用这种方法提取前景,会出现什么样的问题。
使用此方法之前的条件是它在固定摄像机上运行,因此摄像机位置不会有任何移动。
我想做的在下面。
- 从相机读取一帧并将此帧设置为背景图像。这是定期完成的。
- 定期减去之后读取到上面的背景图像的帧。然后只会移动与其他区域颜色不同的物体与背景图像相同。
- 然后使用灰度、二值化、阈值隔离移动对象。
- 迭代以上 4 个进程。
如果我这样做,成功检测到移动物体的概率会很高吗?如果没有...你能告诉我为什么吗?
如果您考虑场景中的照明变化(逐渐或突然),您会发现您的方法不起作用。
对于这些问题,有更强大的解决方案。其中之一(也许是最好的)是应用于背景减法的高斯混合模型。
您可以在OpenCV库中使用BackgroundSubtractorMOG2(GMM的实现)。
您的方案足以应对相机固定且背景静止的情况。室内和人控场景比室外和自然场景更适合这种方法。我为一个检测系统做出了贡献,该系统基本上与您建议的原理相同。但当然,细节至关重要。根据我的经验说几句话
- 初始化步骤可能会导致收敛到正常状态的速度非常慢。将背景设置为第一帧,然后移动到移动对象后面的背景片段将被视为对象。更好的方法是取 N 个前帧的中位数。
- 在光线条件发生变化等的情况下,简单的减法可能还不够。您可能会发现相似性标准更适合您的应用程序。
- 对差异图像进行简单的阈值设置可能还不够。一种简单的方法是扩大前景,以免更新意外标识为像素的背景。
- 您的第 4 步不清楚,我假设您的意思是仅在最后一帧上标识为背景的那些位置更新前景。请注意,使用这种简单的方法,实际是背景的像素可能会永远停留在"前景"标签中,因为您不会更新它们下面的背景。对此有许多可能的解决方案。
有很多
方法可以解决这个问题,这实际上取决于输入图像,哪种方法最合适。可能值得对该主题进行一些阅读
您建议的方法可能有效,但这是解决此问题的略微非标准的方法。我主要担心的是,从背景中减去几张图像可能会导致饱和,然后您可能会丢失运动的一些细节。最好在连续图像之间取差值,然后将二值化/阈值应用于这些图像。
过去对我有用的另一种(更复杂的)方法是获取图像的子区域,然后与新图像交叉关联。这种相关性中的峰值可用于识别运动方向 - 如果不止一个东西在移动,这是一种有用的方法。
例如,也可以结合使用上述两种方法。
- 从第一个背景中减去第二个图像。
- 阈值等,以查找发生移动的投资回报率
- 使用模式匹配方法来跟踪后续运动,重点关注上面检测到的投资回报率。
最好的方法将取决于您的应用,但有很多关于这个主题的论文
相关文章:
- 检测win32服务创建和删除的最佳方法
- CoreCLR 中的检测探查器 - 将帮助程序程序集加载到 dotnet 进程的方法
- 通常使用什么方法来检测时间情况?
- 如何在窗口过程方法中检测击键?
- 有没有一种方法可以使用SFINAE来检测一个类型是否实现了给定的抽象基类
- 有什么方法可以检测我的类的对象是否在堆栈上创建
- 是否有内置方法来检测异常值?
- 使用信号检测子进程何时终止的最佳方法是什么?
- 检测 X11 与韦兰的有效方法,最好是使用 CMake
- 在Qt3D中进行碰撞检测的预期方法(或好方法)是什么?
- 有没有更好的方法来检测向量中一个项目的多次出现?
- 如何实现一致的方法来检测鼠标按钮被按住
- 在 c++ 生成器中检测绘制线的窗口坐标的最佳方法
- 无法使方法存在检测机制正常工作
- 检测特定像素上的某种颜色并在检测到后发送点击的最快方法是什么?
- Anagram检测方法C .将字符串转换为ASCII值的问题
- 在Qt中解析方法的元数据时检测方法的来源
- 如何检测方法是否为虚拟方法
- 如何在opencv中制作自己的特征检测方法
- gtest 仅在该方法在 .h 中实现时检测方法,而不是在 .cpp 中实现(cMake;问题发生在"make"之后)