目录
简述
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提供了多种背景减除算法:
基于高斯混合模型(Mixture of Gaussians, MOG)的背景减除算法。该算法通过多个高斯分布来对每个像素的颜色值进行建模,以表示背景的颜色变化。随着时间推移,不断更新这些高斯分布的参数,从而适应背景的缓慢变化。
fgbg = cv2.bgsegm.createBackgroundSubtractorMOG(history=200, nmixtures=5, backgroundRatio=0.7, noiseSigma=0)
参数说明:
import cv2
cap = cv2.VideoCapture('D:\\resource\\opencv\\vtest.avi')
mog = cv2.bgsegm.createBackgroundSubtractorMOG()
while(True):
ret, frame = cap.read()
if ret == False:
break
mask = mog.apply(frame)
cv2.imshow('img',mask)
k = cv2.waitKey(10)
if k ==27:
break
cap.release()
cv2.destroyAllWindows()
原始视频:
背景减除后:
该接口是对 cv2.bgsegm.createBackgroundSubtractorMOG 的改进版本,同样基于高斯混合模型。它引入了一些优化机制,如自适应学习率和阴影检测,能更好地适应光照变化和背景的动态变化。
fgbg = cv2.createBackgroundSubtractorMOG2(history=500, varThreshold=16, detectShadows=True)
参数说明:
import cv2
cap = cv2.VideoCapture('D:\\resource\\opencv\\vtest.avi')
#mog = cv2.bgsegm.createBackgroundSubtractorMOG()
mog = cv2.createBackgroundSubtractorMOG2()
while(True):
ret, frame = cap.read()
if ret == False:
break
mask = mog.apply(frame)
cv2.imshow('img',mask)
k = cv2.waitKey(10)
if k ==27:
break
cap.release()
cv2.destroyAllWindows()
基于 K最近邻(K - Nearest Neighbors, KNN)算法的背景减除方法。它通过对每个像素维护一个样本集,对于新的像素值,通过查找其 K 个最近邻来判断该像素是属于背景还是前景。
fgbg = cv2.createBackgroundSubtractorKNN(history=500, dist2Threshold=400, detectShadows=True)
参数说明:
主要特点:
结合了统计模型和贝叶斯推理的方法。它首先使用前几帧图像来初始化背景模型,然后通过逐帧更新来适应背景的变化。该算法在处理光照变化和动态背景方面有一定的优势。
fgbg = cv2.bgsegm.createBackgroundSubtractorGMG(initializationFrames=120, decisionThreshold=0.8)
参数说明:
主要特点:
基于计数的背景减除算法。它为每个像素维护一个计数器,记录该像素值在一段时间内出现的次数。通过比较当前像素值的计数与阈值,判断该像素是属于背景还是前景。
fgbg = cv2.bgsegm.createBackgroundSubtractorCNT(minPixelStability=15, useHistory=True, maxPixelStability=15 * 60, isParallel=True)
参数说明:
主要特点:
基于局部二值模式的背景减除算法。它通过计算像素的局部二值模式来描述像素的纹理特征,从而更好地区分背景和前景。
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
)
参数说明:
主要特点:
如果背景基本保持不变或者变化非常缓慢,例如监控固定场景(如室内走廊、停车场等)。考虑以下接口:
当背景存在一定的动态变化,如风吹动的树叶、晃动的水面等。考虑以下接口:
在光照基本不变的环境中,上述提到的 :
可以满足需求,它们在光照稳定时能以高效的方式进行背景减除。
在光照剧烈变化的场景中,优先考虑:
它能够自适应光照的变化,通过不断调整背景模型来适应光照强度和颜色的改变。
如实时视频监控、工业自动化中的快速检测等场景,需要算法能够在短时间内完成处理。
是最佳选择,其计算速度非常快,并且支持并行处理,能够满足实时处理的需求。
当处理速度不是首要考虑因素,更注重检测的准确性时,可以选择:
cv2.createBackgroundSubtractorMOG2 虽然计算复杂度较高,但能提供更准确的前景检测结果;cv2.bgsegm.createBackgroundSubtractorLSBP 基于局部二值模式,对纹理特征有较好的捕捉能力,能减少误检,但计算速度较慢。
小运动物体的检测:
对于小的运动物体检测效果较好,它在初始化背景模型后能快速响应小物体的运动,但可能会产生较多噪声。
对纹理特征要求较高的场景:
如果场景中阴影的存在会干扰前景物体的检测,需要选择支持阴影检测的算法:
都具备阴影检测功能,它们可以将检测到的阴影以灰色显示在前景掩码中,避免阴影被误判为前景物体。
通过网盘分享的文件:vtest.avi
链接: https://pan.baidu.com/s/1LqFBQUAssC9qbynf9U5LOg?pwd=csdn 提取码: csdn