opencv-python 视频前后景分离
背景分离(BS)是一种通过使用静态相机来生成前景掩码(即包含属于场景中的移动对象像素的二进制图像)的常用技术。BS计算前景掩码,在当前帧与背景模型之间执行减法运算,其中包含场景的静态部分,或者更一般而言,考虑到所观察场景的特征,可以将其视为背景的所有内容。
前后景分离分为两步:第一步,计算背景的初始模型;第二步,更新模型以适应场景中可能的变化。
opencv中视频前后景分离的方法通常由3个,都是第三方的包。
1 混合高斯模型为基础的前后景分离方法
createBackgroundSubtractorMOG([, history[, nmixtures[, backgroundRatio[, noiseSigma]]]]) -> retval
history:进行建模的时候需要多长时间的参考帧,默认200ms
nmixtures:高斯范围值,默认5
backgroundRatio:背景比例,莫默认0.7
noiseSigma:降噪,默认0,表示自动降噪
上述参数通常不需要修改。
2 MOG2方法
同MOG类似,但是对亮度产生的阴影有更好的识别,缺点是会产生很多细小噪声。
createBackgroundSubtractorMOG2([, history[, varThreshold[, detectShadows]]]) -> retval
history:默认500ms
detectShadows:是否检测阴影,默认True。
3 GMG方法
静态背景图像估计和每个像素的贝叶斯分割,抗噪性更强。
createBackgroundSubtractorGMG([, initializationFrames[, decisionThreshold]]) -> retval
initializationFrames:初始化帧数,默认120帧
前后景分离的实例视频是经典的 vtest.avi,三种背景分离方法如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | import cv2 import numpy as np cap = cv2.VideoCapture( './vtest.avi' ) fps = cap.get(cv2.CAP_PROP_FPS) # print(fps) # MOG算法 mog = cv2.bgsegm.createBackgroundSubtractorMOG() #bgsegm是三方的一个包 #MOG2 与MOG类似,但是对亮度产生的阴影有更好的识别,缺点是会产生很多细小的噪点。 mog2 = cv2.createBackgroundSubtractorMOG2() #GMG去背景:静态背景图像估计,和每个像素的贝叶斯分割,抗噪性强。(实际上噪声还是比较多) gmg = cv2.bgsegm.createBackgroundSubtractorGMG() while True : ret,frame = cap.read() if ret = = True : fgmask2 = mog2. apply (frame) #应用前后景分离算法 fgmask = mog. apply (frame) fgmask_gmg = gmg. apply (frame) cv2.imshow( 'fgmask' ,fgmask) cv2.imshow( 'fgmask2' ,fgmask2) cv2.imshow( 'fgmask_gmg' ,fgmask_gmg) key = cv2.waitKey( 10 ) if key = = ord ( 'q' ): break else : #视频播放完毕,退出循环 break cap.release() cv2.destroyAllWindows() |
就个人感觉而言,MOG2效果最好,也可能是opencv版本和算法版本问题。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」