Ptr<BackgroundSubtractorMOG2> bgsubtractor = createBackgroundSubtractorMOG2();
// 用于训练背景的帧数,如果不手动设置learning rate,history就被用于计算当前的learning rate,
// history越大,learning rate越低,背景更新越慢
bgsubtractor->setHistory(500);
// 方差阈值,主要用于判断前景还是背景,值越大,灵敏度越低
// 如果光照变化明显,如阳光下的水面,建议设为25,36
bgsubtractor->setVarThreshold(16);
// 是否检测有影子,开启后会增加算法复杂度
bgsubtractor->setDetectShadows(true);
// 高斯模型个数,默认5个,最多8个
bgsubtractor->setBackgroundRatio(4);
// 高斯背景模型权重和阈值,nmixtures个模型按权重重排序后,
// 只取模型权重累加值大于backgroundRatio的前几个作为背景模型
bgsubtractor->setNMixtures(5);
// 新建高斯模型的方差初始值,默认15
bgsubtractor->setVarInit(15);
// 背景更新时,用于限制高斯模型方差的最大值,默认20
bgsubtractor->setVarMax(20);
// 背景更新时,用于限制高斯模型方差的最小值,默认4
bgsubtractor->setVarMin(4);
// 方差阈值,用于已经存在的匹配的模型,如果不存在则新建一个
bgsubtractor->setVarThresholdGen(100);
代码:
Mat Quick_Demo::getframe(VideoCapture cap, float scallingFactor)//从摄像头提取画面
{
Mat frame, output;
//捕获当前画面
cap >> frame;
//resize
resize(frame, frame, Size(), scallingFactor, scallingFactor, INTER_AREA);
//灰度图转换
cvtColor(frame, output, COLOR_BGR2GRAY);
flip(output, output, 1);
return output;
}
void Quick_Demo::gaussMOG()
{
//高斯混合模型定义
Ptr<BackgroundSubtractorMOG2> bgm2 = createBackgroundSubtractorMOG2();
bgm2->setHistory(20);
bgm2->setVarThreshold(100);
bgm2->setDetectShadows(false);
//定义捕获图像与输出图像
Mat frame, fgmaskMOG2,output;
char ch;
VideoCapture cap(0);
float scallingFactor = 0.75;
namedWindow("高斯混合捕获", WINDOW_FREERATIO);
while (true) {
ch = waitKey(100);
if (ch == 27)
break;
//传入处理后的捕获图像
frame = getframe(cap,scallingFactor);
//更新背景,这里在前面如果背景没更新,就每帧重置背景为黑。
bgm2->apply(frame, fgmaskMOG2);
//把捕获图像与背景图像叠加
//frame.copyTo(output, fgmaskMOG2);
imshow("frame", frame);
//显示
imshow("高斯混合捕获", fgmaskMOG2);
}
cap.release();
destroyAllWindows();
}
参考:(33条消息) opencv:动态目标检测--BackgroundSubtractorMOG2 C++_zhaohanqq的博客-优快云博客