OpenCV 中用于背景分割(背景建模)的一个类cv::bgsegm::BackgroundSubtractorCNT

发布于:2025-05-08 ⋅ 阅读:(84) ⋅ 点赞:(0)
  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

cv::bgsegm::BackgroundSubtractorCNT 是 OpenCV 中用于背景分割(背景建模)的一个类,特别适用于实时应用。CNT 代表“快速且有效的背景减除算法(Fast and Efficient Background Subtraction Algorithm)”。该算法设计时考虑了效率和速度,使其非常适合需要处理大量视频数据或在资源受限的设备上运行的应用。

主要特点

  • 高效性:旨在提供更快的处理速度,同时保持合理的准确性。
  • 适应性:能够适应场景中的光照变化。
  • 内存使用优化:通过限制存储像素历史的最大数量来节省内存。
  • 简单易用:相对简单的接口,易于集成到不同的项目中。

构造函数

cv::bgsegm::BackgroundSubtractorCNT::BackgroundSubtractorCNT
(
    int minPixelStability=15, 
    bool useHistory=true, 
    int maxPixelStability=15*60, 
    bool isParallel=true
);

参数:

  • minPixelStability: 像素被认为是稳定之前所需连续帧的数量。
  • useHistory: 是否使用历史信息。
  • maxPixelStability: 像素的最大稳定性值,超过此值后不再增加。
  • isParallel: 是否并行计算。

主要函数

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

    cv::Ptr< cv::bgsegm::BackgroundSubtractorCNT > bgSubtractor = cv::bgsegm::createBackgroundSubtractorCNT();

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

运行结果

在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到