当前位置: 首页 > news >正文

OpenCV 中用于背景分割的一个类cv::bgsegm::BackgroundSubtractorGMG

  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

cv::bgsegm::BackgroundSubtractorGMG 是 OpenCV 中用于背景分割的一个类,它实现了基于贝叶斯推理的背景建模算法(Bayesian inference-based background modeling algorithm)。这个算法特别适合处理复杂的背景变化,例如光照变化、动态背景等。

主要特点

  • 适应性强:能够很好地适应光照变化和其他环境变化。
  • 初始化过程:需要一定数量的帧来初始化背景模型,默认是前 120 帧。
  • 噪声过滤:通过形态学操作去除前景掩码中的噪声。

构造函数

在较新的 OpenCV 版本中,通常不直接使用构造函数来创建 BackgroundSubtractorGMG 实例,而是通过工厂方法 cv::bgsegm::createBackgroundSubtractorGMG() 来创建。这是因为 OpenCV 将许多对象的创建封装到了这些工厂方法中,以便更好地管理内存和配置参数。

Ptr<BackgroundSubtractorGMG> cv::bgsegm::createBackgroundSubtractorGMG
(int initializationFrames = 120, double decisionThreshold = 0.8
);

参数:

  • initializationFrames: 初始化背景模型所需的帧数,默认值为 120。
  • decisionThreshold: 决策阈值,超过该阈值则认为是前景像素,默认值为 0.8。

主要方法

apply函数

函数原型
void apply
(InputArray image, OutputArray fgmask, double learningRate=-1
);
参数
  • image: 输入当前帧。
  • fgmask: 输出前景掩码图像。
  • learningRate: 学习率,决定了新获取的信息对模型的影响速度。默认值 -1 表示自动选择学习率。

getBackgroundImage函数

函数原型
void getBackgroundImage
(OutputArray backgroundImage
) const;
参数
  • backgroundImage: 输出背景图像。

代码示例

#include <opencv2/bgsegm.hpp>
#include <opencv2/opencv.hpp>int main()
{cv::VideoCapture cap( 0 );  // 打开摄像头if ( !cap.isOpened() ){std::cerr << "无法打开摄像头!" << std::endl;return -1;}// 创建 GMG 背景减除器cv::Ptr< cv::bgsegm::BackgroundSubtractorGMG > bgSubtractor = cv::bgsegm::createBackgroundSubtractorGMG();cv::Mat frame, fgMask;while ( true ){cap >> frame;  // 获取新帧if ( frame.empty() )break;  // 到达视频结尾bgSubtractor->apply( frame, fgMask );  // 应用背景减除器cv::imshow( "Original Frame", frame );cv::imshow( "Foreground Mask", fgMask );if ( cv::waitKey( 30 ) >= 0 )break;  // 按任意键退出}return 0;
}

运行结果

白色的是运动的物体,后面静止的背景都没了。
在这里插入图片描述

相关文章:

  • FFmpeg(7.1版本)编译生成ffplay
  • Linux 系统命令使用指南1
  • 项目文档归档的最佳实践有哪些?
  • 数字电子技术基础(五十五)——D触发器
  • 微信小程序预览文件 兼容性苹果
  • 【C++】类和对象(下)
  • 桥接模式(Bridge)
  • ubuntu nobel + qt5.15.2 设置qss语法识别正确
  • 应用 | AI 自动化某讯会议转录与摘要生成系统
  • 使用英伟达 Riva 和 OpenAI 构建 AI 聊天机器人
  • 游戏引擎学习第263天:添加调试帧滑块
  • 数据报(Datagram)与虚电路(Virtual Circuit)的区别
  • 无线局域网专题 | 第十一章 | AC+AP配置
  • 【Java学习笔记】封装
  • C# 语言介绍
  • 实变函数 第四章 可测函数
  • 系统 Python 与 Conda 环境的灵活切换
  • 4、反应釜压力监控系统 - /自动化与控制组件/reaction-vessel-monitor
  • JavaScript 数据存储全攻略:从 Cookie 到 IndexedDB
  • 关于 js:2. 对象与原型链
  • 中山大学人类学系原系主任冯家骏逝世,享年95岁
  • 巴基斯坦全面恢复领空开放
  • 《尤物公园》连演8场:观众上台,每一场演出都独一无二
  • 游客称在网红雪山勒多曼因峰需救援被开价2.8万,康定文旅:封闭整改
  • “一嗨租车”陷“五年后扣费”疑云,用户:违章处理莫名消失
  • 身临其境感受伟人思想力量,“马克思书房”在上海社科馆揭幕