OpenCV CUDA 模块中在 GPU 上执行基于高斯混合模型(Mixture of Gaussians, MOG)的背景建模与前景分割算法类cv::cuda::BackgroundSubtract

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

算法描述

cv::cuda::BackgroundSubtractorMOG 是 OpenCV 的 CUDA 模块中提供的一个类,用于在 GPU 上执行基于高斯混合模型(Mixture of Gaussians, MOG)的背景建模与前景分割算法。它属于 OpenCV 中用于视频分析和计算机视觉任务的一部分,适用于实时视频流中的运动目标检测。

该类实现了基于 高斯混合模型 的背景/前景分割算法,并利用 CUDA 在 GPU 上加速处理过程。它主要用于从视频流中分离出移动的物体(前景),是视频监控、行为识别等应用的基础组件。

构造函数 && 参数

cv::cuda::BackgroundSubtractorMOG::BackgroundSubtractorMOG
(
    int history = 200,
    int numComponents = 5,
    int blockSize = 3,
    bool noiseVariance = true
);
参数描述
history历史帧数,用于学习背景模型。越大越稳定但响应慢。默认值:200
numComponents每个像素点使用的高斯分量数量。通常为 3~5,默认为 5
blockSize图像块大小(以像素为单位),用于局部背景建模。默认值为 3
noiseVariance是否使用固定噪声方差进行优化。默认启用

主要方法

1. apply函数

对输入图像帧 frame 应用当前背景模型,生成前景掩膜 fgmask。

void apply
(
	InputArray frame, 
	OutputArray fgmask, 
	double learningRate = -1, 
	Stream& stream = Stream::Null()
)
  • frame: 输入图像(8UC3 彩色图或 8UC1 灰度图)
  • fgmask: 输出前景掩膜(CV_8UC1,0 表示背景,255 表示前景)
  • learningRate: 学习率(0.0 ~ 1.0)。若为负,则自动根据历史长度计算。
  • stream: CUDA 流对象(用于异步操作)
  1. getBackgroundImage函数

获取当前估计的背景图像。

void getBackgroundImage
(
	OutputArray backgroundImage, 
	Stream& stream = Stream::Null()
) const;
  • backgroundImage: 输出背景图像(与输入图像同类型)

代码示例

#include <opencv2/cudabgsegm.hpp>
#include <opencv2/cudaobjdetect.hpp>
#include <opencv2/opencv.hpp>

int main()
{
    cv::VideoCapture cap( 0 );  // 打开摄像头
    if ( !cap.isOpened() )
        return -1;

    cv::cuda::GpuMat d_frame, d_fgmask;
    cv::Mat frame, fgmask;

    // 创建 MOG 背景建模器
    cv::Ptr< cv::cuda::BackgroundSubtractorMOG > bgSubtractor = cv::cuda::createBackgroundSubtractorMOG();

    while ( true )
    {
        cap >> frame;
        if ( frame.empty() )
            break;

        cv::cuda::GpuMat d_frame( frame );

        // 应用背景建模
        bgSubtractor->apply( d_frame, d_fgmask );
        d_fgmask.download( fgmask );

        // 显示结果
        cv::imshow( "Foreground Mask", fgmask );

        if ( cv::waitKey( 30 ) == 27 )
            break;  // ESC 键退出
    }

    return 0;
}

运行结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

村北头的码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值