- 操作系统:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 编程语言:C++11
算法描述
背景/前景分割的基类:
这个类仅用于定义整个背景/前景分割算法家族的共同接口
cv::BackgroundSubtractor 是 OpenCV 中用于背景减除的基类。它定义了一个接口,用于实现各种背景减除算法。这个基类包含了所有背景减除算法共同的操作,如初始化、处理帧以获得前景掩码、更新背景模型等。
背景减除(Background Subtraction)是一种用于视频分析的技术,主要用于检测和分割前景物体(即移动物体),以从连续的视频帧中分离出背景部分。这种方法基于一个假设:视频中的大部分区域在大多数时间内是相对静止的,这些区域被视为背景;而前景则是相对于背景发生移动的对象。
成员函数apply()
计算一个前景掩码。
函数原型
cpp
virtual void cv::BackgroundSubtractor::apply
(
InputArray image,
OutputArray fgmask,
double learningRate = -1
)
参数
- 参数image 下一个视频帧。
- 参数fgmask 输出的前景掩码,作为一个8位的二值图像。
- 参数learningRate 一个介于0和1之间的值,表示背景模型的学习速度。负参数值使算法使用某种自动选择的学习率。0意味着背景模型完全不更新,1意味着背景模型完全从最后一帧重新初始化
代码示例
cpp
#include <iostream>
#include <opencv2/opencv.hpp>
int main( int argc, char** argv )
{
// 创建一个背景减除器实例
cv::Ptr< cv::BackgroundSubtractor > pBackSub = cv::createBackgroundSubtractorMOG2();
// 设置参数
// 打开视频文件
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;
}
运行结果
视频中那个玉竹是在摆动的状态