OpenCV视觉分析之运动分析(5)背景减除类BackgroundSubtractorMOG2的使用
- 操作系统:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 编程语言:C++11
算法描述
基于高斯混合模型的背景/前景分割算法。
该类实现了在文献[320]和[319]中描述的高斯混合模型背景减除。
cv::BackgroundSubtractorMOG2 类是 OpenCV 中用于背景减除的一种实现方式,它基于 Gaussian Mixture Model with a recursive algorithm (GMM) 来估计背景模型。这种模型对于动态场景下的背景减除非常有效,因为它可以适应背景的变化并且对光照变化有一定的鲁棒性。
主要成员函数
函数apply()
计算一个前景掩码
函数原型
virtual void cv::BackgroundSubtractorMOG2::apply
(
InputArray image,
OutputArray fgmask,
double learningRate = -1
)
参数
- 参数image 下一个视频帧。浮点帧将不经缩放直接使用,且应处于[0,255]范围内。
- 参数fgmask 作为8位二值图像的输出前景掩码。
- 参数learningRate 取值范围在0到1之间,表示背景模型的学习速度。参数的负值会使算法使用某种自动选择的学习率。0意味着背景模型完全不更新,1意味着背景模型将完全重新初始化为最近一帧的状态。
代码示例
#include <iostream>
#include <opencv2/opencv.hpp>
int main( int argc, char** argv )
{
// 创建一个 BackgroundSubtractorMOG2 对象
cv::Ptr< cv::BackgroundSubtractor > pBackSub = cv::createBackgroundSubtractorMOG2( 500, // 设置历史帧数
16, // 设置方差阈值
true // 启用阴影检测
);
// 打开视频文件
cv::VideoCapture capture( 0);
if ( !capture.isOpened() )
{
std::cerr << "Failed to open video file." << std::endl;
return -1;
}
// 读取每一帧并处理
cv::Mat frame, fgMask;
while ( capture.read( frame ) )
{
// 应用背景减除
pBackSub->apply( frame, fgMask );
// 显示结果
cv::imshow( "Frame", frame );
cv::imshow( "FG Mask", fgMask );
// 按 'q' 键退出
if ( cv::waitKey( 30 ) == 'q' )
{
break;
}
}
// 释放资源
capture.release();
cv::destroyAllWindows();
return 0;
}
运行结果
效果比BackgroundSubtractorKNN好很多