计算机视觉图像处理机器学习【免费下载链接】opencv_contrib项目地址https://gitcode.com/gh_mirrors/ope/opencv_contrib点击查看免费下载背景减除Background Subtraction是众多视觉应用的前置关键步骤其目标是从静态摄像头画面中分离出移动前景。本文以 opencv_contrib 仓库中 bgsegm 模块的背景减除教程 为主体系统讲解 bgsegm 提供的两种经典算法——高斯混合模型GMM类的BackgroundSubtractorMOG与基于统计背景估计和贝叶斯逐像素分割的BackgroundSubtractorGMG并结合模块源码与测试用例深入剖析其参数含义、底层实现与调参建议。读完本文你将能够独立编写可运行的背景减除程序理解两类算法的适用场景并掌握利用源码与测试验证算法行为的方法。背景减除问题定义与挑战在许多基于视觉的应用中首要任务是从画面中把人或车单独提取出来再做后续的跟踪、计数或行为分析。典型场景包括访客计数器静态摄像头统计进出房间的人数交通摄像头从固定机位的画面中提取车辆信息安防监控检测进入监控区域的活动目标。技术上这些场景都可以归结为从静态背景中提取移动前景。如果手里恰好有一张纯背景图像没有访客的房间、没有车辆的道路任务就非常简单——用当前帧减去背景图即可得到前景目标。但大多数情况下我们拿不到这样的干净背景必须从已有的视频序列中在线估计背景模型这就引出了背景减除算法的核心问题如何在有前景物体持续出现的条件下逐步建立并维护一个可靠的背景模型。更麻烦的是阴影问题阴影会随着物体一起移动简单做像素差分会把阴影也标记成前景导致前景结果被污染。因此一个好的背景减除算法还需要具备一定的阴影与光照鲁棒性。针对上述需求bgsegm 模块完整模块头文件见 bgsegm.hpp模块教程索引见 table_of_content_bgsegm.markdown提供了多种改进的背景/前景分割算法。本文重点讲解其中的BackgroundSubtractorMOG和BackgroundSubtractorGMG两种其余算法CNT、GSOC、LSBP 等将在文末补充介绍。运行环境与准备教程中的示例代码采用 Python OpenCV 接口所有算法均通过cv.bgsegm命名空间访问。使用前需确认安装包含 contrib 模块的 OpenCV 发行包opencv-contrib-python确保cv.bgsegm命名空间可用准备一段静态摄像头拍摄的视频教程示例使用vtest.avi引入numpy与cv2两个基础库。import numpy as np import cv2 as cvBackgroundSubtractorMOG高斯混合模型背景分割算法原理BackgroundSubtractorMOG是一种基于高斯混合模型Gaussian Mixture Model的背景/前景分割算法源自 P. KadewTraKuPong 与 R. Bowden 于 2001 年发表的论文An improved adaptive background mixture model for real-time tracking with shadow detection。其核心思想是对每一个背景像素用一个由 K 个高斯分布组成的混合模型来刻画论文建议 K 取 3 到 5。每个高斯分量对应场景中该位置可能出现的某种颜色状态各分量的权重表示该颜色在场景中停留的时间比例停留时间久、更静态的颜色→ 权重高被认为是可能的背景颜色频繁变化、短暂出现的颜色 → 权重低更可能属于前景。每一帧到来时算法将当前像素值与各高斯分量逐一匹配命中则更新该分量的均值、方差与权重并依据权重阈值重新判定该像素属于背景还是前景未命中则用当前像素值替换权重最低的分量。整个模型是自适应的——背景会随场景缓慢变化而持续更新。创建函数与参数使用cv.bgsegm.createBackgroundSubtractorMOG()创建背景减除对象。根据 bgsegm.hpp 中createBackgroundSubtractorMOG的声明其完整签名为PtrBackgroundSubtractorMOG createBackgroundSubtractorMOG(int history200, int nmixtures5, double backgroundRatio0.7, double noiseSigma0);各参数含义与默认值如下参数默认值含义与建议history200历史长度即背景模型参考的历史帧数在未显式指定学习率时初始学习率按1/min(当前帧数, history)计算见 bgfg_gaussmix.cpp 中apply实现nmixtures5每个像素使用的高斯混合分量个数 K。源码构造函数中会将传入值限制在(0, 8]区间内即最大不超过 8 个分量见 bgfg_gaussmix.cppbackgroundRatio0.7背景比例阈值 T。模型按权重 / 方差排序后从权重最大的分量开始累加累加权重首次超过该阈值之前的分量被认定为背景之后的分量视为前景。源码中该值会被限制在(0, 1]noiseSigma0噪声强度亮度或各颜色通道的标准差。传 0 表示使用自动值源码中默认取30 * 0.5 15见 bgfg_gaussmix.cpp此外源码中还定义了两个内部常量方差匹配阈值varThreshold 2.5 * 2.5与新建分量的初始权重defaultInitialWeight 0.05。对象创建后可通过getHistory/setHistory、getNMixtures/setNMixtures、getBackgroundRatio/setBackgroundRatio、getNoiseSigma/setNoiseSigma四组接口在运行时读写参数。底层实现细节源码级阅读 bgfg_gaussmix.cpp 可以印证上述原理数据布局每个像素的背景模型以MixData结构排序键sortKey weight/sqrt(var)、权重weight、均值mean、方差var连续存储在bgmodel中模型矩阵尺寸为1 × (height × width × nmixtures × (2 2×通道数))的 32F 类型见initialize。匹配判定像素值pix与第 k 个高斯分量的马氏距离平方d2 (pix - mean)²满足d2 varThreshold × var即视为命中命中后按alpha学习率更新权重、均值、方差并按新的排序键插入有序列表。前景判定按排序键从大到小累加权重累加和首次超过backgroundRatio的位置记为kForeground若命中的分量索引kHit kForeground则该像素标记为前景输出 255否则为背景输出 0。学习率策略apply(image, fgmask, learningRate)中未显式传入学习率默认 0时实际学习率取1/min(当前帧数, history)使模型在初始阶段快速收敛、后期缓慢适应。输入限制该实现只支持 8 位 1 通道灰度与 8 位 3 通道BGR图像其他格式会抛出StsUnsupportedFormat异常同时该实现不提供getBackgroundImage支持调用即报StsNotImplemented。Python 示例代码下面的示例来自教程原文打开视频逐帧调用fgbg.apply(frame)得到前景掩码fgmask并实时显示。按EscASCII 27退出。import numpy as np import cv2 as cv cap cv.VideoCapture(vtest.avi) fgbg cv.bgsegm.createBackgroundSubtractorMOG() while(1): ret, frame cap.read() fgmask fgbg.apply(frame) cv.imshow(frame,fgmask) k cv.waitKey(30) 0xff if k 27: break cap.release() cv.destroyAllWindows()提示OpenCV 主库中更新、更完善的cv.createBackgroundSubtractorMOG2()也基于高斯混合模型并额外支持阴影检测可参考主仓库的 background subtraction 教程对应文档ref tutorial_background_subtraction对比使用。BackgroundSubtractorGMG统计背景估计 逐像素贝叶斯分割算法原理BackgroundSubtractorGMG结合了统计背景图像估计与逐像素贝叶斯分割两种思想由 Andrew B. Godbehere、Akihiro Matsukawa 与 Ken Goldberg 在 2012 年发表于Visual Tracking of Human Visitors under Variable-Lighting Conditions for a Responsive Audio Art Installation美国控制会议 ACC。据论文所述该系统曾于 2011 年 3 月 31 日至 7 月 31 日在旧金山当代犹太博物馆支撑了一个名为Are We There Yet?的交互式音频艺术装置成功运行——这是一个在可变光照条件下进行访客跟踪的真实落地案例也正是 GMG 算法对光照变化鲁棒的由来。GMG 的核心工作方式初始化阶段使用前若干帧默认 120 帧进行背景建模。算法为每个像素维护一个颜色直方图记录该位置出现过的不同颜色及其累计权重贝叶斯推理对每个像素根据当前颜色在历史直方图中的权重与背景先验概率用贝叶斯公式计算该像素属于背景的后验概率后验概率过低则判为前景自适应更新估计是自适应的——新观测比旧观测获得更高权重以适应光照的缓慢变化形态学后处理算法内部会对前景掩码做形态学滤波源码中使用中值滤波medianBlur去除零散噪声。创建函数与参数使用cv.bgsegm.createBackgroundSubtractorGMG()创建对象。根据 bgsegm.hpp 的声明PtrBackgroundSubtractorGMG createBackgroundSubtractorGMG(int initializationFrames120, double decisionThreshold0.8);其中initializationFrames是用于初始化背景模型的帧数默认 120decisionThreshold是前景判定阈值默认 0.8高于该值判为前景。其余参数通过BackgroundSubtractorGMG的 set/get 接口配置源码 bgfg_gmg.cpp 中BackgroundSubtractorGMGImpl构造函数给出的完整默认值如下参数set/get 接口默认值含义与源码注释maxFeatures64每个像素直方图中维护的最大不同颜色数稀疏性约束defaultLearningRate0.025学习率取值 0.0 ~ 1.0决定特征从直方图中被遗忘的速度越接近 1 遗忘越慢越接近 0 适应越快numFrames120用于初始化背景模型的帧数quantizationLevels16颜色空间量化级数即每个通道直方图使用的离散等级数1 ~ 255backgroundPrior0.8每个像素属于背景的先验概率是一个灵敏度参数0.0 ~ 1.0decisionThreshold0.8前景判定阈值后验概率超过该值判为前景smoothingRadius7前景图去噪的中值滤波核半径像素updateBackgroundModeltrue是否更新背景模型minVal/maxVal0 / 0图像序列像素的最小/最大值0 表示自动推断8U 取 255、16U 取 65535、32F 取 1.0底层实现细节源码级阅读 bgfg_gmg.cpp 可确认以下行为数据布局每个像素维护nfeatures特征计数、colors最多maxFeatures个颜色值与weights对应权重三张表颜色在存入前先按quantizationLevels做量化见Quantization::apply。贝叶斯公式核心判定语句为posterior (weight × backgroundPrior) / (weight × backgroundPrior (1 − weight) × (1 − backgroundPrior)) 当(1 − posterior) decisionThreshold时判为前景GMG_LoopBody::operator()。直方图中越常见的颜色其后验概率越高越不容易被判成前景。训练模式frameNum numInitializationFrames期间只做训练式更新插入颜色、权重累加最后一帧归一化直方图不输出前景——这正是教程中所说前几帧你会看到全黑窗口的原因。更新策略更新背景模型时所有已有权重乘以(1 − learningRate)当前颜色以learningRate的权重插入insertFeature超出maxFeatures时丢弃最旧特征。并行与去噪逐像素处理通过parallel_for_并行化GMG_LoopBody实现ParallelLoopBody若smoothingRadius 0帧末对掩码执行medianBlur。输入支持支持 8U、16U、32F 深度以及 1/3/4 通道的图像比 MOG 更宽。Python 示例代码由于 GMG 输出的原始掩码可能残留噪声教程建议在apply之后再对掩码执行一次形态学开运算先腐蚀后膨胀以去除小的噪点。示例使用 3×3 椭圆结构元素import numpy as np import cv2 as cv cap cv.VideoCapture(vtest.avi) kernel cv.getStructuringElement(cv.MORPH_ELLIPSE,(3,3)) fgbg cv.bgsegm.createBackgroundSubtractorGMG() while(1): ret, frame cap.read() fgmask fgbg.apply(frame) fgmask cv.morphologyEx(fgmask, cv.MORPH_OPEN, kernel) cv.imshow(frame,fgmask) k cv.waitKey(30) 0xff if k 27: break cap.release() cv.destroyAllWindows()效果对比以下三幅图取自教程原文展示视频第 200 帧的处理结果图片来源modules/bgsegm/tutorials/bgsegm_bg_subtraction/images/可以看到MOG 输出的前景掩码较为干净紧凑GMG 输出经形态学开运算去除噪声后同样能较好地勾勒出行人轮廓两者都能有效分离出移动行人目标。参数调优与实战建议结合两类算法的源码行为给出以下调参思路MOG 调参场景背景变化快如树叶晃动、水面波动时适当增大history让模型更稳定场景突变如摄像机切换时减小history或用较大的learningRate强制重新初始化nmixtures越大表达能力越强但计算与内存开销也越大通常 3 ~ 5 即可backgroundRatio过小会把更多像素判为前景噪声增多过大则可能吞掉慢速运动的前景noiseSigma影响噪声容忍度默认 0自动 15在多数场景下够用。GMG 调参光照变化剧烈的场景正是 GMG 的强项但代价是前numFrames默认 120帧只能看到黑屏且需要较长的初始化时间若可接受可适当减小numFrames以加快收敛decisionThreshold越高越保守减少误报越低越敏感减少漏报前景内孔洞较多时可把开运算结构元素从 3×3 增大到 5×5 等反之噪声多时可增大smoothingRadius内部中值滤波核半径updateBackgroundModel设为false可冻结背景模型适合背景完全静止的受控场景。更多背景减除算法与实用示例程序除了 MOG 与 GMGbgsegm 模块在 bgsegm.hpp 中还提供了其他算法可按需选用BackgroundSubtractorCNT基于像素计数的轻量算法源码注释称其在高端系统上与 MOG2 速度相当在廉价硬件如树莓派 3上比 MOG2 快一倍以上适合嵌入式场景BackgroundSubtractorGSOCGSOC 期间实现的算法非源自论文注释称其在 CDNET 2014 数据集上相比 OpenCV 内其他算法表现更好BackgroundSubtractorLSBP基于局部 SVD 二值模式Local SVD Binary Pattern的背景减除算法SyntheticSequenceGenerator合成视频帧序列生成器可在给定背景与物体图像基础上生成带波浪形背景畸变的测试序列createSyntheticSequenceGenerator(background, object, amplitude2.0, wavelength20.0, wavespeed0.2, objspeed6.0)用于在无真实视频时调试背景减除算法。模块还附带一个可直接编译运行的交互式示例程序 samples/bgfg.cpp它封装了 GMG、CNT、KNN、MOG、MOG2、GSOC、LSBP 七种算法支持以下键盘操作非常适合横向对比各算法效果按c循环切换算法按m切换显示纯前景掩码或幽灵叠加效果前景叠加在原帧上的可视化按n切换 OpenCV 线程数1 ~ 8按空格切换显示延时30ms 与 1ms按q或Esc退出。测试用例如何验证算法行为bgsegm 模块的测试代码可以帮我们确认上述算法行为例如 test/test_backgroundsubtractor_gbh.cpp 针对 GMG 验证了三件事GMG 能处理不同类型7 种深度、不同尺寸2~100 像素宽高、1~4 通道的矩阵训练模式返回空前景掩码在 120 帧训练期内随机生成的模拟图像逐帧送入apply后掩码应全为 0背景与教程前几帧黑屏的说明一致训练结束后异常帧应全部判为前景训练期图像值域集中在上半区间之后喂入覆盖全值域的随机图像掩码应全为 255前景。类似地test/test_backgroundsubtractor_lsbp.cpp 通过把输入整体放大 10 倍来验证 LSBP 描述子对光照强度变化的不变性。这些测试既是对实现正确性的保障也是理解算法语义的绝佳教材。总结本文围绕 bgsegm 模块的两大经典背景减除算法展开MOGKadewTraKuPong Bowden, 2001以 K 个高斯混合模型刻画每个像素权重反映颜色停留时间快速、参数少适合一般监控场景GMGGodbehere et al., 2012以逐像素颜色直方图 贝叶斯推理实现统计背景估计对光照变化更鲁棒但需要较长的初始化帧数且建议配合形态学开运算使用。两者都通过cv.bgsegm.createBackgroundSubtractorXXX()创建、以apply()逐帧输出前景掩码255 为前景、0 为背景接口一致、易于替换。读者可在 bgfg.cpp 交互示例中对比七种算法并结合 bgfg_gaussmix.cpp、bgfg_gmg.cpp 与模块测试代码深入理解各自的行为与适用边界。练习建议用createBackgroundSubtractorMOG(history500, nmixtures3)与默认参数分别运行同一段视频观察前景掩码差异修改 GMG 的setNumFrames(30)观察黑屏初始化阶段缩短后的效果与误报变化将开运算结构元素分别换成 3×3、5×5 椭圆对比 GMG 输出掩码的噪声水平使用SyntheticSequenceGenerator生成合成序列在无真实视频的情况下评估上述算法的鲁棒性。赞分享计算机视觉图像处理机器学习【免费下载链接】opencv_contrib项目地址https://gitcode.com/gh_mirrors/ope/opencv_contrib点击查看免费下载相关推荐OpenCV 背景减除Background Subtraction实战指南bgsegm 模块的 MOG 与 GMG 算法详解OpenCV 背景减除Background Subtraction实战指南bgsegm 模块的 MOG 与 GMG 算法详解 导读 背景减除是视频分析中最计算机视觉图像处理深度学习机器学习OpenCV bgsegm 模块实战使用 MOG 与 GMG 算法进行背景减除OpenCV bgsegm 模块实战使用 MOG 与 GMG 算法进行背景减除 背景减除Background Subtraction是从静态相机视频流中提计算机视觉图像处理深度学习机器学习OpenCV bgsegm 模块实战指南GMG 贝叶斯背景减除算法原理、参数调优与代码示例OpenCV bgsegm 模块实战指南GMG 贝叶斯背景减除算法原理、参数调优与代码示例 导读 本文聚焦 OpenCV 扩展模块 bgsegm Impro计算机视觉图像处理机器学习上一篇Skip框架终极指南用Swift实现iOS与Android双平台开发下一篇MiddleClick-Sonoma重新定义 macOS 中键点击体验的终极指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
