EmguCV学习笔记 C# 9.3 移动检测类

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。

EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。

教程VB.net版本请访问:EmguCV学习笔记 VB.Net 目录-CSDN博客

教程C#版本请访问:EmguCV学习笔记 C# 目录-CSDN博客

笔者的博客网址:https://blog.csdn.net/uruseibest

教程配套文件及相关说明以及如何获得pdf教程和代码,请移步:EmguCV学习笔记

学习VB.Net知识,请移步: vb.net 教程 目录_vb中如何用datagridview-CSDN博客

 学习C#知识,请移步:C# 教程 目录_c#教程目录-CSDN博客

 

9.3 移动检测类

EmguCV主要提供的移动检测类,可以根据不同的算法实现背景建模,帮助我们从动态视频中提取静态前景。在早期版本中,移动检测类主要是BackgroundSubtractor类的继承类,新的版本中,它们主要集中在Emgu.CV.BgSegm命名空间下。这些类都对处理的图像有一定的要求,必须是8位灰度图像或者8位彩色图像。

9.3.1 Emgu.CV.BgSegm命名空间

BgSegm命名空间提供了5个基于背景分割的算法实现,常用于视频中的前景提取:

1、BackgroundSubtractorCNT类(Emgu.CV.BgSegm

BackgroundSubtractorCNT是EmguCV中实现基于连通性的背景建模和前景提取的类。它通过对像素进行连通分析,将相邻的前景像素合并为一个前景区域,从而提高了前景检测的精度和鲁棒性。

由于BackgroundSubtractorCNT类需要维护一个像素的稳定状态,因此对于大尺寸的图像,可能会占用较大的内存空间。

2、BackgroundSubtractorGMG类(Emgu.CV.BgSegm

BackgroundSubtractorGMG是EmguCV中实现基于自适应背景模型的背景建模和前景提取的类。它可以自适应地更新背景模型,以适应背景变化和光照变化等情况。

BackgroundSubtractorGMG类需要较长的初始化时间,因此在使用之前需要先对一定数量的帧进行背景建模

3、BackgroundSubtractorGSOC类(Emgu.CV.BgSegm

BackgroundSubtractorGSOC是EmguCV中实现基于自适应背景模型的背景建模和前景提取的类。它可以自适应地更新背景模型,以适应背景变化和光照变化等情况。

BackgroundSubtractorGSOC类的计算复杂度较高,因此在处理大尺寸的图像时可能需要较长的处理时间。

4、BackgroundSubtractorLSBP类(Emgu.CV.BgSegm

BackgroundSubtractorLSBP是EmguCV中实现基于局部二进制模式(Local Binary Patterns,LBP)的背景建模和前景提取的类。它可以自适应地更新背景模型,以适应背景变化和光照变化等情况。

BackgroundSubtractorLSBP类的计算速度较快,在处理大尺寸的图像时也具有一定的优势。

5、BackgroundSubtractorMOG类(Emgu.CV.BgSegm

BackgroundSubtractorMOG是EmguCV中实现基于高斯混合模型(Gaussian Mixture Model,GMM)的背景建模和前景提取的类。它可以自适应地更新背景模型,以适应背景变化和光照变化等情况。

BackgroundSubtractorMOG类的计算速度较快,在处理大尺寸的图像时也具有一定的优势。

BgSegm命名空间中的类有一个重要的方法:Apply方法。该方法用于将当前帧与背景模型进行比较,提取出前景部分。其声明如下:

public static void Apply(

           this IBackgroundSubtractor subtractor,

                    IInputArray image,

                    IOutputArray fgMask,

           double learningRate = -1

)

参数说明:

  1. image:输入图像,要求为8位灰度图像或彩色图像。
  2. fgmask:输出前景掩码图像,为8位灰度图像。
  3. learningRate:背景模型的学习速率,取值范围为0到1。当学习速率为0时,算法不会对背景模型进行更新;当学习速率为1时,算法完全采用当前帧作为背景模型。当为-1时,则实际的学习速率是根据当前帧与背景模型的相似度来动态调整的。具体来说,如果当前帧与背景模型的相似度较高(即前景变化较小),则算法的学习速率会相应降低,背景模型会更加稳定;如果当前帧与背景模型的相似度较低(即前景变化较大),则算法的学习速率会相应提高,背景模型会更加适应场景变化。这种自适应学习速率的机制可以使算法更加鲁棒,能够适应不同的场景变化。但是,由于学习速率的实际值取决于当前帧与背景模型的相似度,因此无法确定学习速率的具体数值。如果需要精确控制学习速率,建议使用具有固定学习速率的Apply方法并手动调整学习速率参数。

在调用Apply方法时,算法会将输入图像与背景模型进行比较,并将前景像素标记为1,背景像素标记为0,最终生成前景掩码图像。学习速率参数用于控制背景模型的更新速度,当学习速率较大时,背景模型可以更快地适应场景变化,但也容易受到噪声和干扰的影响;当学习速率较小时,背景模型变化相对较慢,但也更加稳定。

关于Apply方法的示例代码,请参看9.3.1.1节【BackgroundSubtractorMOG】。

9.3.1.1 BackgroundSubtractorMOG

BackgroundSubtractorMOG是EmguCV中实现基于高斯混合模型(Gaussian Mixture Model,GMM)的背景建模和前景提取的类。它的构造函数如下:

public BackgroundSubtractorMOG(

                    int history = 200,

                    int nMixtures = 5,

                    double backgroundRatio = 0.7,

                    double noiseSigma = 0

)

参数说明:

  1. history:表示用于背景建模的历史帧数,即建模时考虑的前几帧的像素值。
  2. nMixtures:表示使用的高斯分布数量,即背景颜色的数量,NMixtures越大,模型越复杂,可以更好地适应复杂的背景场景。但NMixtures过大会导致计算时间和内存消耗增加。
  3. backgroundRatio:表示背景像素的阈值,即像素值与背景模型中各个高斯分布的距离阈值。
  4. noiseSigma:表示噪声标准差,即高斯分布的方差。

开发时,根据实际情况需根据需要设置不同的参数值,以达到更好的背景建模和前景提取效果。

【代码位置:frmChapter9_2】Button1_Click、vcMog_ImageGrabbed

        VideoCapture vcMog;

        Emgu.CV.BgSegm.BackgroundSubtractorMOG bsMog;

        Mat moutMog;

        //使用BackgroundSubtractorMOG进行移动检测

        private void Button1_Click(object sender, EventArgs e)

        {

            //使用BackgroundSubtractorMOG默认的参数

            bsMog = new Emgu.CV.BgSegm.BackgroundSubtractorMOG();

            moutMog = new Mat();

            vcMog = new VideoCapture("C:\\learnEmgucv\\movie1.mp4");

            if (vcMog.IsOpened == false)

            {

                MessageBox.Show("打开文件失败");

                return;

            }

            //添加ImageGrabbed事件

            vcMog.ImageGrabbed += vcMog_ImageGrabbed;

            vcMog.Start();

        }

        //ImageGrabbed事件内使用BackgroundSubtractorMOG进行检测

        private void vcMog_ImageGrabbed(object sender, EventArgs e)

        {

            Mat nextframe = new Mat();

            //如果使用Retrieve,那么需要检查视频当前播放的位置

            vcMog.Retrieve(nextframe);

            //判断是否到达视频结束帧

            if (vcMog.Get(CapProp.PosFrames) >= vcMog.Get(CapProp.FrameCount))

            {

                //停止

                vcMog.Stop();

                //释放资源

                vcMog.Dispose();

                //取消事件

                vcMog.ImageGrabbed -= vcMog_ImageGrabbed;

                return;

            }

            //BackgroundSubtractorMOG类的Apply方法

            bsMog.Apply(nextframe, moutMog);

            //检测得到的图像噪声较多,进行滤波

            CvInvoke.MedianBlur(moutMog, moutMog, 15);

            //二值化

            CvInvoke.Threshold(moutMog, moutMog, 220, 255, ThresholdType.Binary);

            ImageBox1.Image = moutMog;

            System.Threading.Thread.Sleep(40);

        }

输出结果如下图所示:

 

图9-5 使用BackgroundSubtractorMOG进行移动目标检测

以下代码在上述代码的基础上,将移动目标标识出来:

【代码位置:frmChapter9_2】Button1_Click、vcMog1_ImageGrabbed

        private void Button1_Click(object sender, EventArgs e)

{

        ……

        //添加ImageGrabbed事件

        vcMog.ImageGrabbed += vcMog1_ImageGrabbed;

        ……

}

        //将移动目标标识出来

        private void vcMog1_ImageGrabbed(object sender, EventArgs e)

        {

            Mat nextframe = new Mat();

            //如果使用Retrieve,那么需要检查视频当前播放的位置

            vcMog.Retrieve(nextframe);

            //判断是否到达视频结束帧

            if (vcMog.Get(CapProp.PosFrames) >= vcMog.Get(CapProp.FrameCount))

            {

                //停止

                vcMog.Stop();

                //释放资源

                vcMog.Dispose();

                //取消事件

                vcMog.ImageGrabbed -= vcMog1_ImageGrabbed;

                return;

            }

            //BackgroundSubtractorMOG类的Apply方法

            bsMog.Apply(nextframe, moutMog);

            //检测得到的图像噪声较多,进行滤波

            CvInvoke.MedianBlur(moutMog, moutMog, 15);

            //二值化

            CvInvoke.Threshold(moutMog, moutMog, 220, 255, ThresholdType.Binary);

            //查找形状

            VectorOfVectorOfPoint contours = new VectorOfVectorOfPoint();

            CvInvoke.FindContours(moutMog, contours, null, RetrType.List, ChainApproxMethod.ChainApproxSimple);

            Mat mshow = new Mat();

            mshow = nextframe.Clone();

            Double contourArea = 0;

            for (int i = 0; i < contours.Size; i++)

            {

                contourArea = CvInvoke.ContourArea(contours[i]);

                //必须大于一定面积才认为是有效的目标

                if (contourArea > 10000)

                {

                    //获得最大外接矩形

                    Rectangle rectmax = CvInvoke.BoundingRectangle(contours[i]);

                    //绘制最大外接矩形

                    CvInvoke.Rectangle(mshow, rectmax, new MCvScalar(0, 0, 255), 3);

                }

            }

            ImageBox1.Image = mshow;

            System.Threading.Thread.Sleep(40);

        }

输出结果如下图所示:

 

图9-6 检测并标识移动目标

附注:GMM模型是一种常用的背景建模算法,它将背景模型表示为多个高斯分布的混合,每个高斯分布对应一种背景颜色。在每次处理新的视频帧时,使用当前帧像素值与背景模型中各个高斯分布的均值和方差进行比较,如果像素值与某个高斯分布的均值和方差差异较小,则将其归为该背景颜色,否则将其视为前景。

9.3.1.2 BackgroundSubtractorCNT

BackgroundSubtractorCNT是EmguCV中实现基于连通性的背景建模和前景提取的类。它的构造函数如下:

public BackgroundSubtractorCNT(

                    int minPixelStability = 15,

                    bool useHistory = true,

                    int maxPixelStability = 900,

                    bool isParallel = true

)

参数说明:

  1. minPixelStability:表示前景像素在背景建模时的最小稳定帧数。当一个像素在连续的minPixelStability帧中被检测为前景时,它才会被认为是真正的前景像素。
  2. useHistory:表示是否使用历史帧数进行计数。
  3. maxPixelStability:表示前景像素在背景建模时的最大稳定帧数。当一个像素在超过maxPixelStability帧中没有被检测为前景时,它会被认为是背景像素。
  4. isParallel:用于控制计算前景掩码的算法是否并行执行。当isParallel为True时,算法会使用多线程并行计算前景掩码,以提高算法的处理速度。当isParallel为False时,算法会使用单线程顺序计算前景掩码,以保证算法的准确性和稳定性。需要注意的是,使用多线程并行计算前景掩码可以显著提高算法的处理速度,但也会带来一些性能和内存开销。如果计算机的处理器性能较弱或内存较少,建议将isParallel参数设置为False,以避免出现性能瓶颈或内存不足的问题。

关于使用BackgroundSubtractorCNT进行移动目标检测的代码,请参看9.3.1.1节【BackgroundSubtractorMOG】的示例代码,可以根据实际需要修改相应参数。

9.3.1.3 BackgroundSubtractorGMG

BackgroundSubtractorGMG是EmguCV中实现基于自适应背景模型的背景建模和前景提取的类。它的构造函数如下:

public BackgroundSubtractorCNT(

                    int minPixelStability = 15,

                    bool useHistory = true,

                    int maxPixelStability = 900,

                    bool isParallel = true

)

参数说明:

  1. initializationFrames:表示背景建模时的初始帧数。在这些帧中,BackgroundSubtractorGMG会学习场景的背景信息,并初始化背景模型。
  2. decisionThreshold:表示前景像素的阈值。当一个像素的概率值大于DecisionThreshold时,它被认为是前景像素,否则为背景像素。

关于使用BackgroundSubtractorGMG进行移动目标检测的代码,请参看9.3.1.1节【BackgroundSubtractorMOG】的示例代码,可以根据实际需要修改相应参数。

9.3.1.4 BackgroundSubtractorGSOC

BackgroundSubtractorGSOC是EmguCV中实现基于自适应背景模型的背景建模和前景提取的类。它的构造函数如下:

public BackgroundSubtractorGSOC(

           BackgroundSubtractorLSBP. CameraMotionCompensation mc = BackgroundSubtractorLSBP.CameraMotionCompensation.None,

                    int nSamples = 20,

                    float replaceRate = 0.003f,

                    float propagationRate = 0.01f,

                    int hitsThreshold = 32,

                    float alpha = 0.01f,

                    float beta = 0.0022f,

                    float blinkingSupressionDecay = 0.1f,

                    float blinkingSupressionMultiplier = 0.1f,

                    float noiseRemovalThresholdFacBG = 0.0004f,

           float noiseRemovalThresholdFacFG = 0.0008f

)

参数说明:

  1. mc:是否使用相机运动补偿。
  2. n示例:指定帧的每个点保留的采样数。
  3. replaceRate:替换旧样本的概率-模型自行更新的速度。
  4. propagationRate:传播到相邻点的概率。
  5. hitsThreshold:样本必须具备多少优势,才能被视为可能的替代品。
  6. alpha:阈值的比例系数。
  7. beta:阈值的偏移系数。
  8. blinkingUppressionDecay:闪烁抑制衰减因子。
  9. blinkingUppressionMultiplier:闪烁的抑制倍数。
  10. noiseRemovalThresholdFacBG:背景点噪声消除强度。
  11. noiseRemovalThresholdFacFG:前景点噪声消除强度。

关于使用BackgroundSubtractorGSOC进行移动目标检测的代码,请参看9.3.1.1节【BackgroundSubtractorMOG】的示例代码,可以根据实际需要修改相应参数。

9.3.1.5 BackgroundSubtractorLSBP

BackgroundSubtractorLSBP是EmguCV中实现基于局部二进制模式(Local Binary Patterns,LBP)的背景建模和前景提取的类。它的构造函数如下:

public BackgroundSubtractorLSBP(

           BackgroundSubtractorLSBP. CameraMotionCompensation mc = BackgroundSubtractorLSBP.CameraMotionCompensation.None,

                    int nSamples = 20,

                    int LSBPRadius = 16,

                    float tlower = 2f,

                    float tupper = 32f,

                    float tinc = 1f,

                    float tdec = 0.05f,

                    float rscale = 10f,

                    float rincdec = 0.005f,

                    float noiseRemovalThresholdFacBG = 0.0004f,

                    float noiseRemovalThresholdFacFG = 0.0008f,

                    int LSBPthreshold = 8,

           int minCount = 2

)

参数说明:

  1. mc:是否使用相机运动补偿。
  2. nSamples:要在帧的每个点保持的采样数。
  3. LSBPRadius:LSBP描述符半径。
  4. tlower:T值的下限。
  5. tupper:T值的上限。
  6. tinc:增加T值的步长。
  7. tdec:减小T值的步长。
  8. rscale:阈值的比例系数。
  9. rincdec:阈值的增加/减少步骤。
  10. noiseRemovalThresholdFacBG:背景点的噪声去除强度。
  11. noiseRemovalThresholdFacFG:前景点的噪声去除强度。
  12. LSBPthreshold:LSBP二进制字符串的阈值。
  13. minCount:将样本视为前景的最小匹配数。

关于使用BackgroundSubtractorLSBP进行移动目标检测的代码,请参看9.3.1.1节【BackgroundSubtractorMOG】的示例代码,可以根据实际需要修改相应参数。

9.3.2 BackgroundSubtractorMOG2类

BackgroundSubtractorMOG2是EmguCV中实现基于高斯混合模型(Gaussian Mixture Model,GMM)的背景建模和前景提取的类。

BackgroundSubtractorMOG2类的构造函数如下:

public BackgroundSubtractorMOG2(

           int history = 500,

                    float varThreshold = 16f,

           bool shadowDetection = true

)

参数说明:

  1. history:表示背景建模时使用的历史帧数。history值越大,背景模型越稳定,但也会增加计算量。
  2. varThreshold:像素和样本之间的方差阈值。当一个像素的方差值超过VarThreshold时,它被认为是前景像素。
  3. shadowDetection:表示是否检测阴影。如果设置为True,则会检测图像中的阴影,并将其标记为前景像素。

BackgroundSubtractorMOG2类的常用属性如下:

  1. History:历史帧数,表示用于建模的最近的几帧图像。
  2. VarThreshold:阈值,用于控制前景和背景之间的差异,当差异超过该阈值时,像素被认为是前景像素,通常设置为16。
  3. BackgroundRatio:背景比例,表示用于建模的背景像素占总像素数的比例,通常设置为0.9。
  4. DetectShadows:是否检测阴影,通常设置为True。如果检测阴影,则前景掩码图像中会包含阴影区域,在后续处理中需要进行额外的处理。
  5. VarThresholdGen:阈值生成率,用于控制阈值的自适应学习率,通常设置为1.0。
  6. VarInit:初始化方差,表示用于初始化高斯混合模型的初始方差,通常设置为15。
  7. VarMin:最小方差,表示每个高斯混合模型允许的最小方差,通常设置为4。
  8. VarMax:最大方差,表示每个高斯混合模型允许的最大方差,通常设置为75。
  9. ShadowValue:阴影值,表示阴影像素的像素值,通常设置为127。
  10. ShadowThreshold:阴影阈值,用于判断像素是否为阴影像素,通常设置为0.5。

在使用BackgroundSubtractorMOG类时,可以通过调整这些属性的值,来控制背景建模的精度和速度。例如,可以增加历史帧数来提高背景模型的稳定性,也可以降低阈值来增加前景像素的数量。需要根据实际情况进行调整。

【代码位置:frmChapter9_2】Button2_Click、vcMog2_ImageGrabbed

        VideoCapture vcMog2;

        Emgu.CV.BackgroundSubtractorMOG2 bsMog2;

        Mat moutMog2;

        //使用BackgroundSubtractorMOG2进行移动检测

        private void Button2_Click(object sender, EventArgs e)

        {

            //使用BackgroundSubtractorMOG2默认的参数

            bsMog2 = new BackgroundSubtractorMOG2();

            moutMog2 = new Mat();

            vcMog2 = new VideoCapture("C:\\learnEmgucv\\movie1.mp4");

            if (vcMog2.IsOpened == false)

            {

                MessageBox.Show("打开文件失败");

                return;

            }

            //添加ImageGrabbed事件

            vcMog2.ImageGrabbed += vcMog2_ImageGrabbed;

            vcMog2.Start();

        }

        //ImageGrabbed事件内使用BackgroundSubtractorMOG2进行检测

        private void vcMog2_ImageGrabbed(object sender, EventArgs e)

        {

            Mat nextframe = new Mat();

            //如果使用Retrieve,那么需要检查视频当前播放的位置

            vcMog2.Retrieve(nextframe);

            //判断是否到达视频结束帧

            if (vcMog2.Get(CapProp.PosFrames) >= vcMog2.Get(CapProp.FrameCount))

            {

                //停止

                vcMog2.Stop();

                //释放资源

                vcMog2.Dispose();

                //取消事件

                vcMog2.ImageGrabbed -= vcMog2_ImageGrabbed;

                return;

            }

            //BackgroundSubtractorMOG2类的Apply方法

            bsMog2.Apply(nextframe, moutMog2);

            //检测得到的图像噪声较多,进行滤波

            CvInvoke.MedianBlur(moutMog2, moutMog2, 15);

            //二值化,如果设置了检测阴影,可以注释掉下面代码看看

            CvInvoke.Threshold(moutMog2, moutMog2, 220, 255, ThresholdType.Binary);

            ImageBox1.Image = moutMog2;

            System.Threading.Thread.Sleep(40);

        }

输出结果如下图所示:

 

图9-7 使用BackgroundSubtractorMOG2进行移动目标检测

BackgroundSubtractorMOG和BackgroundSubtractorMOG2都是EmguCV中用于背景建模和前景提取的类,它们的主要区别在于使用的GMM模型不同。

BackgroundSubtractorMOG使用的是简单的GMM模型,可以适应一定程度的背景变化和光照变化,但在处理复杂场景时可能会产生较多的误检和漏检。

BackgroundSubtractorMOG2使用的是更加复杂的GMM模型,可以自适应地调整模型参数,以适应复杂的背景场景和光照变化等情况。同时,BackgroundSubtractorMOG2还可以检测图像中的阴影,并将其标记为前景像素。

相比之下,BackgroundSubtractorMOG2的前景提取效果更加准确,但计算量和内存消耗也会更大。因此,BackgroundSubtractorMOG适用于对计算资源要求较低的背景建模和前景提取场景,适合处理较为简单的背景场景;而BackgroundSubtractorMOG2适用于对前景提取精度要求较高的场景,可以处理复杂的背景和光照变化等情况。

总的来说,选择使用哪个类要根据实际需求进行判断,如果对前景提取精度要求不高,可以选择BackgroundSubtractorMOG;如果需要更高的前景提取精度,可以选择BackgroundSubtractorMOG2。

9.3.3 BackgroundSubtractorKNN

BackgroundSubtractorKNN是EmguCV中用于背景建模和前景提取的类,它使用KNN算法来进行背景建模和前景提取,相比于传统的GMM模型,它具有更好的自适应性和实时性。

public BackgroundSubtractorKNN(

           int history,

                    double dist2Threshold,

           bool detectShadows

)

参数说明:

  1. history:表示背景建模时使用的历史帧数。history值越大,背景模型越稳定,但也会增加计算量。
  2. dist2Threshold:像素和样本之间距离平方的阈值。当一个像素的方差值超过dist2Threshold时,它被认为是前景像素。
  3. detectShadows:表示是否检测阴影。如果设置为True,则会检测图像中的阴影,并将其标记为前景像素。

BackgroundSubtractorKNN类的常用属性如下:

  1. History:用于模型训练的历史帧数,通常设置为500。History属性值越大,背景模型越稳定,但也会增加计算量。
  2. Dist2Threshold:像素与背景模型之间的距离阈值,通常设置为400.0。如果像素与背景模型之间的距离超过了该阈值,则该像素被视为前景像素。
  3. DetectShadows:是否检测阴影,通常设置为True。如果检测阴影,则前景掩码图像中会包含阴影区域,在后续处理中需要进行额外的处理。
  4. ShadowValue:阴影像素值,通常设置为127。在前景掩码图像中,阴影像素的像素值会被设置为该值。
  5. ShadowThreshold:阴影阈值,通常设置为0.5。如果像素与背景模型之间的距离小于该阈值,则该像素被视为阴影像素。
  6. KNNSample:邻域样本的数量,它指定了每个像素的邻域中应该包含多少个样本,通常设置为7。该属性越大,算法检测前景的准确性越高,但计算量也会相应增加。当该属性为1时,每个像素只考虑其本身作为样本,不考虑邻域样本,因此算法运行速度最快,但检测前景的准确性也最低。KNNSample属性需要根据实际需求进行调整,以平衡算法的性能和准确性。

【代码位置:frmChapter9_2】Button3_Click、vcKNN_ImageGrabbed

        VideoCapture vcKNN;

        Emgu.CV.BackgroundSubtractorKNN bsKNN;

        Mat moutKNN;

    //使用BackgroundSubtractorKNN进行移动检测

        private void Button3_Click(object sender, EventArgs e)

        {

            //使用BackgroundSubtractorKNN

            bsKNN = new BackgroundSubtractorKNN(50, 200.0F, true);

            moutKNN = new Mat();

            vcKNN = new VideoCapture("C:\\learnEmgucv\\movie1.mp4");

            if (vcKNN.IsOpened == false)

            {

                MessageBox.Show("打开文件失败");

                return;

            }

            //添加ImageGrabbed事件

            vcKNN.ImageGrabbed += vcKNN_ImageGrabbed;

            vcKNN.Start();

        }

        //ImageGrabbed事件内使用BackgroundSubtractorKNN进行检测

        private void vcKNN_ImageGrabbed(object sender, EventArgs e)

        {

            Mat nextframe = new Mat();

            //如果使用Retrieve,那么需要检查视频当前播放的位置

            vcKNN.Retrieve(nextframe);

            //判断是否到达视频结束帧

            if (vcKNN.Get(CapProp.PosFrames) >= vcKNN.Get(CapProp.FrameCount))

            {

                //停止

                vcKNN.Stop();

                //释放资源

                vcKNN.Dispose();

                //取消事件

                vcKNN.ImageGrabbed -= vcKNN_ImageGrabbed;

                return;

            }

            //BackgroundSubtractorKNN类的Apply方法

            bsKNN.Apply(nextframe, moutKNN);

            //检测得到的图像噪声较多,进行滤波

            CvInvoke.MedianBlur(moutKNN, moutKNN, 15);

            //二值化,如果设置了检测阴影,可以注释掉下面代码看看

            CvInvoke.Threshold(moutKNN, moutKNN, 220, 255, ThresholdType.Binary);

            ImageBox1.Image = moutKNN;

            System.Threading.Thread.Sleep(40);

        }

输出结果如下图所示:

 

图9-8 使用BackgroundSubtractorKNN进行移动目标检测

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1522932.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

爬取图片保存为pdf

本文章想借着爬虫给大家介绍一下图片转pdf,有需要的友友们可以看看参考参考&#xff0c;有帮助到友友的可以收藏&#xff0b;关注。下面以爬取初中7年级数学上册为例给大家演示一下。网址是这个 https://mp.weixin.qq.com/s?__bizMzAxOTE4NjI1Mw&mid2650214000&idx…

智慧医院是什么?建设智慧医院的关键步骤

智慧医院是什么&#xff1f; 智慧医院是一种新型的医疗机构&#xff0c;它利用先进的信息技术、数据分析和智能化系统&#xff0c;优化医院的管理和服务流程&#xff0c;提高医疗质量和效率。在智慧医院中&#xff0c;所有的运营和管理环节都可以通过数据驱动的方式来实现优化…

Trollspeed网速悬浮窗,精简且强大

我很喜欢iOS的界面UI&#xff0c;它的设计哲学是以人为本&#xff0c;简约而不简单。不过有时候&#xff0c;我也会觉得iOS简约过头了。人类是很没安全感的动物&#xff0c;获取的信息量足够多&#xff0c;我们才会感觉到安全。 在iOS16中&#xff0c;苹果加入了电量百分比显示…

一种快速edit的方法

后端的CURD&#xff0c;通过chatgpt很容易。 前端的CURD&#xff0c;编辑操作稍微有点复杂。 我一开始的想法是编辑的时候使用一个模态框&#xff0c;但是发现不舒服&#xff0c;为了快速实现&#xff0c;我决定点击编辑的时候&#xff0c;直接打开新的页面&#xff0c;这样开…

[数据集][目标检测]街头摊贩识别检测数据集VOC+YOLO格式758张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;758 标注数量(xml文件个数)&#xff1a;758 标注数量(txt文件个数)&#xff1a;758 标注类别…

航电系统,无人机的核心!!!

一、核心组成部分 飞控系统 定义&#xff1a;无人机飞行控制系统&#xff0c;负责接收来自传感器的数据&#xff0c;并根据飞行任务指令&#xff0c;通过算法计算出无人机的姿态和位置信息&#xff0c;进而控制无人机的飞行状态。 组成&#xff1a;通常由主控制器、姿态传感…

深度学习助力病理切片虚拟组织染色|文献精析·24-09-03

小罗碎碎念 这篇文章综述了深度学习技术在生物样本虚拟组织染色领域的最新研究进展&#xff0c;探讨了其在提高病理诊断效率和降低成本方面的潜力。 作者角色作者姓名单位名称&#xff08;英文&#xff09;单位名称&#xff08;中文&#xff09;第一作者Bijie BaiElectrical an…

Flutter App名称跟随手机语言改变而改变

Android 1.修改android/app/src/main/AndroidManifest.xml中的android:lable的值为string/app_name 2.在android/app/src/main/res/values/styles.xml文件中添加App的名称&#xff0c;如果没有这个文件请自行添加。 这里说明一下&#xff0c;如果没有手机语言对应的App名称&a…

Linux之nginx部署项目【前后端分离】(外加redis安装)

nginx安装和访问 1.使用apt安装Nginx apt install -y nginx 用whereis nginx找到和nginx相关目录 nginx目录结构 /usr/sbin/nginx 服务文件 /etc/nginx 配置目录 /usr/share/nginx/html 发部项目 服务名: nginx.service ps -ef | grep nginx apt install -y net-tools …

kafka及异步通知文章上下架

1)自媒体文章上下架 需求分析 2)kafka概述 消息中间件对比 特 性 ActiveMQ RabbitMQ RocketMQ Kafka 开 发 语 言 java erlang java scala 单 机 吞 吐 量 万级 万级 10万级 100万级 时 效 性 ms us ms ms级以内 可 用 性 高&#xff08;主从&#xff0…

c++(list)

目录 迭代器 sort(随机迭代器)​编辑 list(双向迭代器) vector(随记迭代器) find(input迭代器--只读--可传任意类型迭代器) ​编辑 尾插 push_back/emplace_back 插入数据 删除 交换(swap) 排序 链表合并(merge) 删除(remove) 剪切(splice) 去重(un…

Opencv中的直方图(3)直方图比较函数compareHist()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 比较两个直方图。 函数 cv::compareHist 使用指定的方法比较两个密集或两个稀疏直方图。 该函数返回 d ( H 1 , H 2 ) d(H_1, H_2) d(H1​,H2​…

巧用xrename批量重命名下载的影视文件

网上下载了个电视剧&#xff0c;可是文件名比较长&#xff0c;而且是集数用中文表示的&#xff0c;排序都是乱的。期望的是&#xff1a; 1.文件名改短 2.中文的数字改成阿拉伯数字 看下原始文件名&#xff1a; 期望将文件名改短&#xff0c;例如&#xff1a; 修改前&#xff…

Golang环境安装、配置详细

Windows下安装Go开发环境 点我下载 Windows配置Go环境变量 出现工具install失败时&#xff0c;切换其它代理 # 1. 七牛 CDN go env -w GOPROXYhttps://goproxy.cn,direct# 2. 阿里云 go env -w GOPROXYhttps://mirrors.aliyun.com/goproxy/,direct# 3. 官方 go env -w GOP…

硬件工程师笔试面试知识器件篇——电阻

目录 1、电阻 1.1 基础 电阻原理图 阻实物图 1.1.1、定义 1.1.2、工作原理 1.1.3、类型 1.1.4、材料 1.1.5、标记 1.1.6、应用 1.1.7、特性 1.1.8、测量 1.1.9、计算 1.1.10、颜色编码 1.1.11、公差 1.1.12、功率 1.1.13、重要性 1.2、相关问题 1.2.1、电阻…

电路分析 ---- 同相比例放大器和电压跟随器

1 同相比例运算放大器 同相比例运算放大电路引入了电压串联负反馈&#xff0c;故可以认为输入电阻无穷大&#xff0c;输出电阻为0 分析过程 虚短&#xff0c; u N u P u I u_{N}u_{P}u_{I} uN​uP​uI​ i F i R → u o − u N R f u N − 0 R → u o − u I R f u I R i…

【前端面试】leetcode指针解法javascript

最大盛水 https://leetcode.cn/problems/container-with-most-water/ var maxArea = function(height) {// 左右指针靠拢let left = 0;let right = height.length-1;let maxArea = 0; while(left<right){// 计算出 当前的容积 与最大容积比较,取出最大的const currentAre…

算法数学加油站:一元高斯分布(正态分布)Python精美科研绘图(PDF、CDF、PPF、ECDF曲线;QQ图)

这类博客针对算法学习时可能遇到的数学知识补充&#xff0c;但不会太多废话&#xff0c;主要是公式结合Python代码精美绘图理解&#xff01; 本期重点&#xff1a; 参数&#xff1a;期望、标准差曲线&#xff1a;概率密度曲线PDF、累积概率密度函数CDF、百分点函数PPF应用&am…

【Webpack】基本使用方法

参考视频&#xff1a; 30 分钟掌握 Webpack_哔哩哔哩_bilibili 什么是webpack 简单来说就是一个 打包工具&#xff0c; 可以将互相依赖的html、css、js以及图片字体等资源文件&#xff0c;经过处理打包成一个可执行的项目文件 &#x1f330;看例子 环境初始化 在需要使用…

C语言 09 流程控制

if 如果需要判断某个条件&#xff0c;当满足此条件时&#xff0c;才执行某些代码&#xff0c;那这个时候该怎么办呢&#xff1f;可以使用if语句来实现&#xff1a; #include <stdio.h>int main() {int i 0;// 只希望i大于10的时候才执行下面的打印语句if (i > 10) …