- 操作系统: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 将许多对象的创建封装到了这些工厂方法中,以便更好地管理内存和配置参数。
cpp
Ptr<BackgroundSubtractorGMG> cv::bgsegm::createBackgroundSubtractorGMG
(
int initializationFrames = 120,
double decisionThreshold = 0.8
);
参数:
- initializationFrames: 初始化背景模型所需的帧数,默认值为 120。
- decisionThreshold: 决策阈值,超过该阈值则认为是前景像素,默认值为 0.8。
主要方法
apply函数
函数原型
cpp
void apply
(
InputArray image, OutputArray fgmask, double learningRate=-1
);
参数
- image: 输入当前帧。
- fgmask: 输出前景掩码图像。
- learningRate: 学习率,决定了新获取的信息对模型的影响速度。默认值 -1 表示自动选择学习率。
getBackgroundImage函数
函数原型
cpp
void getBackgroundImage
(
OutputArray backgroundImage
) const;
参数
- backgroundImage: 输出背景图像。
代码示例
cpp
#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;
}
运行结果
白色的是运动的物体,后面静止的背景都没了。