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()

计算一个前景掩码

函数原型
cpp 复制代码
virtual void cv::BackgroundSubtractorMOG2::apply
(
	InputArray 	image,
	OutputArray 	fgmask,
	double 	learningRate = -1 
)		
参数
  • 参数image 下一个视频帧。浮点帧将不经缩放直接使用,且应处于0,255范围内。
  • 参数fgmask 作为8位二值图像的输出前景掩码。
  • 参数learningRate 取值范围在0到1之间,表示背景模型的学习速度。参数的负值会使算法使用某种自动选择的学习率。0意味着背景模型完全不更新,1意味着背景模型将完全重新初始化为最近一帧的状态。

代码示例

cpp 复制代码
#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好很多

相关推荐
tellmewhoisi2 小时前
深度学习0:数学知识:正态分布4(坐标变换的缩放比例(面积微元变换))
人工智能·深度学习
布吉岛的石头2 小时前
Java 程序员第 50 阶段14:灾难性遗忘与回放
人工智能·深度学习·transformer
不吃鱼的羊2 小时前
诊断27解锁dll文件制作(Visual Stdio无法安装版)
人工智能
后端小肥肠2 小时前
漫画工坊上线用户破百:公众号漫画从需求到变现全复盘
人工智能·aigc·agent
赛博山人3 小时前
字节跳动下线扣子企业版,团队已并入豆包
人工智能
isboyjc3 小时前
Lomo Agent:面向创作型、持续协作 Agent 的架构设计与工程实践
人工智能·架构·agent
小蒋观天下3 小时前
码率、I帧间隔、智能编码冲突:H.265+导致AI取流解码异常
人工智能
roman_日积跬步-终至千里4 小时前
AI 能让一个人成为团队吗?从数据中台到 OPC,重新理解软件工程能力
大数据·人工智能·软件工程
在所不辞兄4 小时前
为什么神经网络在训练集损失已接近零后继续训练,测试性能仍可能继续提升,而不是单纯地越来越过拟合?
人工智能·深度学习·神经网络·机器学习·智能仿真