目录
简述
1. MOG
🔷1.1 主要特点
🔷1.2 代码示例
🔷1.3 运行效果
2. MOG2
🔷2.1 主要特点
🔷2.2 代码示例
🔷2.3 运行效果
3. KNN
4. GMG
5. CNT
6. LSBP
7. 如何选择适合的接口?
🔷7.1 考虑场景的动态性
🔷7.2 考虑光照变化情况
🔷7.3 考虑实时性要求
🔷7.4 考虑物体特征
🔷7.5 考虑阴影影响
8. 资源下载
简述
在计算机视觉领域,背景减除广泛应用于目标检测、视频监控、运动分析等任务。OpenCV提供了多种背景减除算法:
- cv2.bgsegm.createBackgroundSubtractorMOG
- cv2.createBackgroundSubtractorMOG2
- cv2.createBackgroundSubtractorKNN
- cv2.bgsegm.createBackgroundSubtractorGMG
- cv2.bgsegm.createBackgroundSubtractorCNT
- cv2.bgsegm.createBackgroundSubtractorLSBP
1. MOG
基于高斯混合模型(Mixture of Gaussians, MOG)的背景减除算法。该算法通过多个高斯分布来对每个像素的颜色值进行建模,以表示背景的颜色变化。随着时间推移,不断更新这些高斯分布的参数,从而适应背景的缓慢变化。
fgbg = cv2.bgsegm.createBackgroundSubtractorMOG(history=200, nmixtures=5, backgroundRatio=0.7, noiseSigma=0)
参数说明:
- history:用于建模背景的历史帧数,默认 200。
- nmixtures:高斯混合模型中的高斯分布数量,默认 5。
- backgroundRatio:背景比例,用于确定哪些高斯分布属于背景,默认 0.7。
- noiseSigma:噪声标准差,默认 0。
🔷1.1 主要特点
- 早期的高斯混合模型实现,算法相对简单。
- 对光照变化和背景动态变化的适应性较差。
- 计算速度相对较快,但在复杂场景下检测精度有限。
🔷1.2 代码示例
import cv2cap = cv2.VideoCapture('D:\\resource\\opencv\\vtest.avi')
mog = cv2.bgsegm.createBackgroundSubtractorMOG()while(True):ret, frame = cap.read()if ret == False:breakmask = mog.apply(frame)cv2.imshow('img',mask)k = cv2.waitKey(10) if k ==27:breakcap.release()
cv2.destroyAllWindows()
🔷1.3 运行效果
原始视频:
背景减除后:
2. MOG2
该接口是对 cv2.bgsegm.createBackgroundSubtractorMOG 的改进版本,同样基于高斯混合模型。它引入了一些优化机制,如自适应学习率和阴影检测,能更好地适应光照变化和背景的动态变化。
fgbg = cv2.createBackgroundSubtractorMOG2(history=500, varThreshold=16, detectShadows=True)
参数说明:
- history:用于建模背景的历史帧数,默认 500。
- varThreshold:像素与背景模型之间的方差阈值,用于判断像素是否属于前景,默认 16。
- detectShadows:是否检测阴影,默认 True。
🔷2.1 主要特点
- 对光照变化和背景动态变化有更好的适应性。
- 能够检测阴影并将其以灰色显示在前景掩码中。
- 计算复杂度相对较高,处理速度比 cv2.bgsegm.createBackgroundSubtractorMOG 稍慢。
🔷2.2 代码示例
import cv2cap = cv2.VideoCapture('D:\\resource\\opencv\\vtest.avi')
#mog = cv2.bgsegm.createBackgroundSubtractorMOG()
mog = cv2.createBackgroundSubtractorMOG2()while(True):ret, frame = cap.read()if ret == False:breakmask = mog.apply(frame)cv2.imshow('img',mask)k = cv2.waitKey(10) if k ==27:breakcap.release()
cv2.destroyAllWindows()
🔷2.3 运行效果
3. KNN
基于 K最近邻(K - Nearest Neighbors, KNN)算法的背景减除方法。它通过对每个像素维护一个样本集,对于新的像素值,通过查找其 K 个最近邻来判断该像素是属于背景还是前景。
fgbg = cv2.createBackgroundSubtractorKNN(history=500, dist2Threshold=400, detectShadows=True)
参数说明:
- history(可选):用于建模背景的历史帧数,默认值为 500。
- dist2Threshold(可选):像素与背景样本之间的距离阈值,用于判断像素是否属于前景,默认值为 400。
- detectShadows(可选):是否检测阴影,默认值为 True。如果设置为 True,检测到的阴影将以灰色显示在前景掩码中。
主要特点:
- 对动态背景有较好的适应性,能快速适应背景的变化。
- 在某些场景下计算速度比 cv2.createBackgroundSubtractorMOG2 快。
- 对噪声有一定的鲁棒性。
4. GMG
结合了统计模型和贝叶斯推理的方法。它首先使用前几帧图像来初始化背景模型,然后通过逐帧更新来适应背景的变化。该算法在处理光照变化和动态背景方面有一定的优势。
fgbg = cv2.bgsegm.createBackgroundSubtractorGMG(initializationFrames=120, decisionThreshold=0.8)
参数说明:
- initializationFrames:用于初始化背景模型的帧数,默认 120。
- decisionThreshold:决策阈值,用于判断像素是前景还是背景,默认 0.8。
主要特点:
- 能够快速适应背景的初始变化。
- 对于小的运动物体检测效果较好,但可能会产生较多的噪声。
- 计算复杂度相对较高,处理速度较慢。
5. CNT
基于计数的背景减除算法。它为每个像素维护一个计数器,记录该像素值在一段时间内出现的次数。通过比较当前像素值的计数与阈值,判断该像素是属于背景还是前景。
fgbg = cv2.bgsegm.createBackgroundSubtractorCNT(minPixelStability=15, useHistory=True, maxPixelStability=15 * 60, isParallel=True)
参数说明:
- minPixelStability:像素成为背景所需的最小稳定帧数,默认 15。
- useHistory:是否使用历史信息,默认 True。
- maxPixelStability:像素保持稳定的最大帧数,默认 15 * 60。
- isParallel:是否并行处理,默认 True。
主要特点:
- 计算速度非常快,适合实时应用。
- 对光照变化有一定的鲁棒性,但在复杂场景下的检测精度可能不如其他算法。
6. LOBSTER
基于局部二值模式的背景减除算法。它通过计算像素的局部二值模式来描述像素的纹理特征,从而更好地区分背景和前景。
fgbg = cv2.bgsegm.createBackgroundSubtractorLSBP(mc=1,nSamples=20,LSBPRadius=16,Tlower=2.0,Tupper=32.0,Tinc=1.0,Tdec=0.05,Rscale=10.0,Rincdec=0.005,noiseRemovalThresholdFacBG=0.0004,noiseRemovalThresholdFacFG=0.0008
)
参数说明:
- mc:多通道标志,默认值为 1,表示使用多通道模式。
- nSamples:每个像素的样本数量,默认值为 20。这个参数决定了用于构建背景模型的样本数量,样本数越多,背景模型越稳定,但计算量也会相应增加。
- LSBPRadius:LSBP 算子的半径,默认值为 16。它控制了 LBP 特征提取的邻域大小,半径越大,能捕捉到的纹理信息越丰富,但计算复杂度也会提高。
- Tlower:前景阈值下限,默认值为 2.0。用于判断像素是否属于前景的较低阈值。
- Tupper:前景阈值上限,默认值为 32.0。用于判断像素是否属于前景的较高阈值。
- Tinc:阈值增加步长,默认值为 1.0。当像素被判定为前景时,背景模型的阈值会以这个步长增加。
- Tdec:阈值减小步长,默认值为 0.05。当像素被判定为背景时,背景模型的阈值会以这个步长减小。
- Rscale:半径缩放因子,默认值为 10.0。用于调整背景模型的更新速度。
- Rincdec:半径缩放因子的增减步长,默认值为 0.005。用于控制半径缩放因子的动态调整。
- noiseRemovalThresholdFacBG:背景噪声去除阈值因子,默认值为 0.0004。用于去除背景中的噪声点。
- noiseRemovalThresholdFacFG:前景噪声去除阈值因子,默认值为 0.0008。用于去除前景中的噪声点。
主要特点:
- 对于具有明显纹理差异的前景和背景,能够更准确地区分。
- 利用纹理特征进行背景减除,可以在一定程度上减少由于光照变化、噪声等因素导致的误检。
- 计算复杂度较高,处理速度相对较慢,不太适合对实时性要求极高的场景。
7. 如何选择适合的接口?
🔷7.1 考虑场景的动态性
如果背景基本保持不变或者变化非常缓慢,例如监控固定场景(如室内走廊、停车场等)。考虑以下接口:
- cv2.bgsegm.createBackgroundSubtractorMOG
- cv2.bgsegm.createBackgroundSubtractorCNT
当背景存在一定的动态变化,如风吹动的树叶、晃动的水面等。考虑以下接口:
- cv2.createBackgroundSubtractorMOG2
- cv2.createBackgroundSubtractorKNN
🔷7.2 考虑光照变化情况
在光照基本不变的环境中,上述提到的 :
- cv2.bgsegm.createBackgroundSubtractorMOG
- cv2.bgsegm.createBackgroundSubtractorCNT
可以满足需求,它们在光照稳定时能以高效的方式进行背景减除。
在光照剧烈变化的场景中,优先考虑:
- cv2.createBackgroundSubtractorMOG2
它能够自适应光照的变化,通过不断调整背景模型来适应光照强度和颜色的改变。
🔷7.3 考虑实时性要求
如实时视频监控、工业自动化中的快速检测等场景,需要算法能够在短时间内完成处理。
- cv2.bgsegm.createBackgroundSubtractorCNT
是最佳选择,其计算速度非常快,并且支持并行处理,能够满足实时处理的需求。
当处理速度不是首要考虑因素,更注重检测的准确性时,可以选择:
- cv2.createBackgroundSubtractorMOG2
- cv2.bgsegm.createBackgroundSubtractorLSBP
cv2.createBackgroundSubtractorMOG2 虽然计算复杂度较高,但能提供更准确的前景检测结果;cv2.bgsegm.createBackgroundSubtractorLSBP 基于局部二值模式,对纹理特征有较好的捕捉能力,能减少误检,但计算速度较慢。
🔷7.4 考虑物体特征
小运动物体的检测:
- cv2.bgsegm.createBackgroundSubtractorGMG
对于小的运动物体检测效果较好,它在初始化背景模型后能快速响应小物体的运动,但可能会产生较多噪声。
对纹理特征要求较高的场景:
- cv2.bgsegm.createBackgroundSubtractorLSBP
🔷7.5 考虑阴影影响
如果场景中阴影的存在会干扰前景物体的检测,需要选择支持阴影检测的算法:
- cv2.createBackgroundSubtractorMOG2
- cv2.createBackgroundSubtractorKNN
都具备阴影检测功能,它们可以将检测到的阴影以灰色显示在前景掩码中,避免阴影被误判为前景物体。
8. 资源下载
通过网盘分享的文件:vtest.avi
链接: https://pan.baidu.com/s/1LqFBQUAssC9qbynf9U5LOg?pwd=csdn 提取码: csdn