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

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;
}

运行结果

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

http://www.xdnf.cn/news/4515.html

相关文章:

  • DeepSeek智能时空数据分析(八):NL2SQL绘制河流-轨迹缓冲区如何生成
  • 如何在自己的服务器上部署静态网页并通过IP地址进行访问
  • 使用 Celery + Redis + Eventlet 实现 Python 异步编程(Windows 环境)
  • STM32--TIM--函数
  • 卢dns免费二级域名分发
  • 【Python os模块完全指南】从基础到高效文件操作
  • 智算中心基础设施0-1建设全流程及投产后的运维
  • 物业设备管理的“多系统协同”模式:ERP、IoT与工单系统如何联动?
  • 202505扫描主机:升级Tomcat解决Tomcat 安全漏洞(CVE-2025-24813)【为了同一个tomcat版本安装多个服务】
  • 什么是Blender?怎么获取下载Blender格式文件模型
  • Pinecone向量库 VS Redis
  • DeepSeek的100个应用场景
  • 什么是TCC?什么是二阶段提交?三阶段提交?
  • 格雷狼优化算法`GWO 通过模拟和优化一个信号处理问题来最大化特定频率下的功率
  • Java消息队列性能优化实践:从理论到实战
  • 快速get sizeof和strlen的区别 !
  • 做 iOS 调试时,我尝试了 5 款抓包工具
  • ubuntu nobel + qt5.15.2 设置qss语法识别正确
  • 在vue里,使用dayjs格式化时间并实现日期时间的实时更新
  • K8S安装部署(v1.27.6)
  • 【Mybatis-plus常用语法】
  • 《[CISCN 2022 初赛]ez_usb》
  • 6、CMake基础:流程控制
  • Linux 信号(下篇)
  • 元子与元组的关系解析:从简单到复杂大跨界大综合的融智学研究
  • 深入理解 Node.js 模块化(CommonJS):原理、用法与避坑指南
  • 无人机上的热成像相机可以单独使用吗?
  • 康养休闲旅游行程服务实训室:打造沉浸式康养旅游人才培养新模式
  • 【linux常用指令】du命令
  • base64与图片的转换和预览