opencv c++ 高斯混合模型使用

Ptr 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 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的博客-CSDN博客

你可能感兴趣的:(opencv,c++,opencv,人工智能,计算机视觉)