背景提取
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了背景提取相关的知识,希望对你有一定的参考价值。
谁能建议我快速获取前景图像?
目前我正在使用BackgroundSubtractorMOG2类来执行此操作。这很慢。我的任务不需要那么复杂的算法。
我可以在binging中获得背景图像。相机位置不会改变。所以我相信有一个简单的方法可以做到这一点。
我需要捕捉在相机前移动的物体的斑点。并且总会有一个对象。
答案
我建议做如下,简单的解决方案:
- 计算差异矩阵: cv :: absdiff(frame,background,absDiff); 这使得absDiff中的每个像素(i,j)设置为| frame(i,j) - background(i.j)|。每个通道(例如R,G,B)独立地进行处理。
- 将结果转换为单通道monocolor图像: cv :: cvtColor(absDiff,absDiffGray,cv :: COLOR_BGR2GRAY);
- 应用二进制过滤: cv :: threshold(absDiffGray,absDiffGrayThres,0,255,CV_THRESH_BINARY | CV_THRESH_OTSU); 在这里,我们使用Ots'u方法来确定适当的阈值水平。如果步骤2中有任何噪音,二进制过滤器会将其删除。
- 在absDiffGrayThres图像中应用斑点检测。这可以是内置的opencv方法或手动编写的代码之一,用于查找值为255的像素位置(记住快速opencv像素检索操作)
在没有GPU支持的相当老的Core 2 Duo 2.1 GHz,4 GB RAM上,这样的过程足以快速管理640x480 RGB图像,帧速率至少为30 fps。
硬件注释:确保相机镜头光圈未设置为自动调整。想象一下以下情况:您在开头计算了背景图像。然后,出现一些对象并覆盖相机视图的较大部分。较少的光线进入镜头,并且由于自动光调节,相机增加光圈,背景颜色变化,差异给出了实际上没有任何物体的斑点。
以上是关于背景提取的主要内容,如果未能解决你的问题,请参考以下文章