如何用MOG算法从视频流中提取前景背景?
摘要:前言 今天来学习Samples中的第二个例子:使用 MOG(Mixture of Gaussians,高斯混合模型)算法来从视频流中分离前景和背景。 示例中的代码很短: public override void RunTest() { us
前言
今天来学习Samples中的第二个例子:使用 MOG(Mixture of Gaussians,高斯混合模型)算法来从视频流中分离前景和背景。
示例中的代码很短:
public override void RunTest()
{
using var capture = new VideoCapture(MoviePath.Bach);
using var mog = BackgroundSubtractorMOG.Create();
using var windowSrc = new Window("src");
using var windowDst = new Window("dst");
using var frame = new Mat();
using var fg = new Mat();
while (true)
{
capture.Read(frame);
if (frame.Empty())
break;
mog.Apply(frame, fg, 0.01);
windowSrc.Image = frame;
windowDst.Image = fg;
Cv2.WaitKey(50);
}
}
先从示例代码开始学习,然后再使用WPF做一个界面。
效果:
就这张效果图你可能不清楚在干嘛,但是一看动态的效果图你大概就懂分离前景和背景是什么意思了。
开始学习
using var capture = new VideoCapture(MoviePath.Bach);
创建了一个VideoCapture对象,这个是什么呢?
VideoCapture 是OpenCVSharp中用于视频捕获和读取的核心类,它提供了从多种视频源(包括摄像头、视频文件、网络流等)获取图像帧的统一接口。该类是计算机视觉应用中视频处理的基础组件,支持实时视频流处理和离线视频文件分析。
using var mog = BackgroundSubtractorMOG.Create();
BackgroundSubtractorMOG 是 OpenCV 中的一个背景减法算法,用于:
从视频流中分离前景和背景
检测运动物体
基于高斯混合模型(Mixture of Gaussians)进行背景建模
mog.Apply(frame, fg, 0.01); // 对每一帧应用背景减法
其中:
frame 是输入的视频帧
fg 是输出的前景掩码
0.01 是学习率参数
BackgroundSubtractorMOG又是什么呢?
BackgroundSubtractorMOG 是 OpenCvSharp 中实现基于高斯混合模型(Gaussian Mixture-based)的背景/前景分割算法的类。该类继承自 BackgroundSubtractor 抽象类,用于从视频序列中分离前景和背景对象。
高斯混合模型是一种无监督的聚类算法,它假设所有数据点都是由若干个不同的、符合高斯分布(正态分布)的模型“混合”生成的。它的目标就是找出这些高斯分布的最佳参数。刚入门学习,先当一名合格的掉包侠,知道这些算法在哪些场景下可以用到就行了,基本上都已经封装好了。
