- 操作系统:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 编程语言:C++11
算法描述
cv::bgsegm::BackgroundSubtractorLSBP 是 OpenCV 中用于背景分割的一个类,它基于局部样本二进制模式(Local Sample Binary Pattern, LSBP)进行背景建模。该算法特别适用于处理光照变化、阴影以及动态背景等复杂场景。
主要特点
- 高效性:能够在保持较高检测准确性的同时实现较快的处理速度。
- 适应性强:能够很好地适应光照变化和其他环境变化。
- 参数可调:允许用户通过调整多个参数来优化背景建模过程。
- 基于纹理信息:利用了图像中的局部纹理信息(LSBP),从而提高了前景检测的鲁棒性。
构造函数
与大多数现代 OpenCV 背景减除器一样,不直接使用构造函数创建 BackgroundSubtractorLSBP 实例,而是通过工厂方法 cv::bgsegm::createBackgroundSubtractorLSBP() 来创建实例。
cpp
Ptr<BackgroundSubtractorLSBP> cv::bgsegm::createBackgroundSubtractorLSBP
(
int mc = 4,
int nSamples = 20,
float noiseRemovalThresholdFacBG = 0.0004f,
float noiseRemovalThresholdFacFG = 0.0008f,
int LSBPRadius = 16,
float Tlower = 2.0f,
float Tupper = 32.0f,
float Tinc = 1.0f,
float Tdec = 0.05f,
float Rscale = 10.0f,
float Rincdec = 0.005f,
double noiseCount = 7,
double binaryThreshold = 2,
bool useLAB = true
);
参数:
- mc: 每个像素的最大成分数量,默认值为 4。
- nSamples: 需要初始化的样本数,默认值为 20。
- noiseRemovalThresholdFacBG: 背景噪声移除阈值因子,默认值为 0.0004。
- noiseRemovalThresholdFacFG: 前景噪声移除阈值因子,默认值为 0.0008。
- LSBPRadius: LSBP 算法使用的半径,默认值为 16。
- Tlower: 下限阈值,默认值为 2.0。
- Tupper: 上限阈值,默认值为 32.0。
- Tinc: 阈值增加量,默认值为 1.0。
- Tdec: 阈值减少量,默认值为 0.05。
- Rscale: 缩放比例,默认值为 10.0。
- Rincdec: 缩放增量/减量,默认值为 0.005。
- noiseCount: 噪声计数,默认值为 7。
- binaryThreshold: 二值化阈值,默认值为 2。
- useLAB: 是否使用 LAB 颜色空间,默认值为 true。
主要函数
apply函数
函数原型
cpp
void apply
(
InputArray image, OutputArray fgmask, double learningRate=-1
);
参数
- image: 输入当前帧。
- fgmask: 输出前景掩码图像。
- learningRate: 学习率,决定了新获取的信息对模型的影响速度。默认值 -1 表示自动选择学习率。
getBackgroundImage函数
函数原型
cpp
void getBackgroundImage
(
OutputArray backgroundImage
) const;
参数
- backgroundImage: 输出背景图像。
代码示例
cpp
#include <opencv2/bgsegm.hpp>
#include <opencv2/opencv.hpp>
int main()
{
cv::VideoCapture cap( 0 ); // 打开摄像头
if ( !cap.isOpened() )
{
std::cerr << "无法打开摄像头!" << std::endl;
return -1;
}
// 创建 LSBP 背景减除器
cv::Ptr< cv::bgsegm::BackgroundSubtractorLSBP > bgSubtractor = cv::bgsegm::createBackgroundSubtractorLSBP();
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;
}
运行结果
