EmguCV学习笔记 VB.Net 9.3 移动检测类

news2024/9/23 3:30:50

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

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命名空间中的类时,可以在代码最前面加上

Imports Emgu.CV.BgSegm

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

Public Shared Sub Apply (

         image As IInputArray,

         fgMask As IOutputArray,

         Optional learningRate As Double = -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 Sub New (

         Optional history As Integer = 200,

         Optional nMixtures As Integer = 5,

         Optional backgroundRatio As Double = 0.7,

         Optional noiseSigma As Double = 0

)

参数说明:

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

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

【代码位置:frmChapter9_2】Button1_Click、vcMog_ImageGrabbed

    Dim vcMog As VideoCapture

    Dim bsMog As Emgu.CV.BgSegm.BackgroundSubtractorMOG

    Dim moutMog As Mat

    '使用BackgroundSubtractorMOG进行移动检测

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        '使用BackgroundSubtractorMOG默认的参数

        bsMog = New Emgu.CV.BgSegm.BackgroundSubtractorMOG()

        moutMog = New Mat

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

        If vcMog.IsOpened = False Then

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

            Exit Sub

        End If

        '添加ImageGrabbed事件

        AddHandler vcMog.ImageGrabbed, AddressOf vcMog_ImageGrabbed

        vcMog.Start()

    End Sub

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

    Private Sub vcMog_ImageGrabbed(sender As Object, e As EventArgs)

        Dim nextframe As New Mat

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

        vcMog.Retrieve(nextframe)

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

        If vcMog.Get(CapProp.PosFrames) >= vcMog.Get(CapProp.FrameCount) Then

            '停止

            vcMog.Stop()

            '释放资源

            vcMog.Dispose()

            '取消事件

            RemoveHandler vcMog.ImageGrabbed, AddressOf vcMog_ImageGrabbed

            Exit Sub

        End If

        'BackgroundSubtractorMOG类的Apply方法

        bsMog.Apply(nextframe, moutMog)

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

        CvInvoke.MedianBlur(moutMog, moutMog, 15)

        '二值化

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

        ImageBox1.Image = moutMog

        Threading.Thread.Sleep(40)

End Sub

输出结果如下图所示:

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

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

【代码位置:frmChapter9_2】Button1_Click、vcMog1_ImageGrabbed

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        ……

        '添加ImageGrabbed事件

        AddHandler vcMog.ImageGrabbed, AddressOf vcMog1_ImageGrabbed

        ……

End Sub

    '将移动目标标识出来

    Private Sub vcMog1_ImageGrabbed(sender As Object, e As EventArgs)

        ……

        '二值化

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

        '查找形状

        Dim contours As New VectorOfVectorOfPoint

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

        Dim mshow As New Mat

        mshow = nextframe.Clone

        Dim contourArea As Double

        For i As Integer = 0 To contours.Size - 1

            contourArea = CvInvoke.ContourArea(contours(i))

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

            If contourArea > 10000 Then

                '获得最大外接矩形

                Dim rectmax As Rectangle = CvInvoke.BoundingRectangle(contours(i))

                '绘制最大外接矩形

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

            End If

        Next

        ImageBox1.Image = mshow

        Threading.Thread.Sleep(40)

End Sub

输出结果如下图所示:

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

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

9.3.1.2 BackgroundSubtractorCNT

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

Public Sub New (

         Optional minPixelStability As Integer = 15,

         Optional useHistory As Boolean = true,

         Optional maxPixelStability As Integer = 900,

         Optional isParallel As Boolean = 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 Sub New (

         initializationFrames As Integer,

         decisionThreshold As Double

)

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

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

9.3.1.4 BackgroundSubtractorGSOC

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

Public Sub New (

         Optional mc As BackgroundSubtractorLSBP. CameraMotionCompensation = BackgroundSubtractorLSBP.CameraMotionCompensation.None,

         Optional nSamples As Integer = 20,

         Optional replaceRate As Single = 0.003F,

         Optional propagationRate As Single = 0.01F,

         Optional hitsThreshold As Integer = 32,

         Optional alpha As Single = 0.01F,

         Optional beta As Single = 0.0022F,

         Optional blinkingSupressionDecay As Single = 0.1F,

         Optional blinkingSupressionMultiplier As Single = 0.1F,

         Optional noiseRemovalThresholdFacBG As Single = 0.0004F,

         Optional noiseRemovalThresholdFacFG As Single = 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 Sub New (

         Optional mc As BackgroundSubtractorLSBP. CameraMotionCompensation = BackgroundSubtractorLSBP.CameraMotionCompensation.None,

         Optional nSamples As Integer = 20,

         Optional LSBPRadius As Integer = 16,

         Optional tlower As Single = 2F,

         Optional tupper As Single = 32F,

         Optional tinc As Single = 1F,

         Optional tdec As Single = 0.05F,

         Optional rscale As Single = 10F,

         Optional rincdec As Single = 0.005F,

         Optional noiseRemovalThresholdFacBG As Single = 0.0004F,

         Optional noiseRemovalThresholdFacFG As Single = 0.0008F,

         Optional LSBPthreshold As Integer = 8,

         Optional minCount As Integer = 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 Sub New (

         Optional history As Integer = 500,

         Optional varThreshold As Single = 16F,

         Optional shadowDetection As Boolean = 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

    Dim vcMog2 As VideoCapture

    Dim bsMog2 As Emgu.CV.BackgroundSubtractorMOG2

    Dim moutMog2 As Mat

    '使用BackgroundSubtractorMOG2进行移动检测

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click

        '使用BackgroundSubtractorMOG2默认的参数

        bsMog2 = New BackgroundSubtractorMOG2()

        moutMog2 = New Mat

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

        If vcMog2.IsOpened = False Then

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

            Exit Sub

        End If

        '添加ImageGrabbed事件

        AddHandler vcMog2.ImageGrabbed, AddressOf vcMog2_ImageGrabbed

        vcMog2.Start()

    End Sub

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

    Private Sub vcMog2_ImageGrabbed(sender As Object, e As EventArgs)

        Dim nextframe As New Mat

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

        vcMog2.Retrieve(nextframe)

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

        If vcMog2.Get(CapProp.PosFrames) >= vcMog2.Get(CapProp.FrameCount) Then

            '停止

            vcMog2.Stop()

            '释放资源

            vcMog2.Dispose()

            '取消事件

            RemoveHandler vcMog2.ImageGrabbed, AddressOf vcMog2_ImageGrabbed

            Exit Sub

        End If

        'BackgroundSubtractorMOG2类的Apply方法

        bsMog2.Apply(nextframe, moutMog2)

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

        CvInvoke.MedianBlur(moutMog2, moutMog2, 15)

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

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

        ImageBox1.Image = moutMog2

        Threading.Thread.Sleep(40)

End Sub

输出结果如下图所示:

图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 Sub New (

         history As Integer,

         dist2Threshold As Double,

         detectShadows As Boolean

)

参数说明:

  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

    Dim vcKNN As VideoCapture

    Dim bsKNN As Emgu.CV.BackgroundSubtractorKNN

    Dim moutKNN As Mat

    '使用BackgroundSubtractorKNN进行移动检测

    Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click

        '使用BackgroundSubtractorKNN

        bsKNN = New BackgroundSubtractorKNN(50, 200.0F, True)

        moutKNN = New Mat

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

        If vcKNN.IsOpened = False Then

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

            Exit Sub

        End If

        '添加ImageGrabbed事件

        AddHandler vcKNN.ImageGrabbed, AddressOf vcKNN_ImageGrabbed

        vcKNN.Start()

    End Sub

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

    Private Sub vcKNN_ImageGrabbed(sender As Object, e As EventArgs)

        Dim nextframe As New Mat

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

        vcKNN.Retrieve(nextframe)

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

        If vcKNN.Get(CapProp.PosFrames) >= vcKNN.Get(CapProp.FrameCount) Then

            '停止

            vcKNN.Stop()

            '释放资源

            vcKNN.Dispose()

            '取消事件

            RemoveHandler vcKNN.ImageGrabbed, AddressOf vcKNN_ImageGrabbed

            Exit Sub

        End If

        'BackgroundSubtractorKNN类的Apply方法

        bsKNN.Apply(nextframe, moutKNN)

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

        CvInvoke.MedianBlur(moutKNN, moutKNN, 15)

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

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

        ImageBox1.Image = moutKNN

        Threading.Thread.Sleep(40)

End Sub

输出结果如下图所示:

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

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

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

相关文章

第十一课,多分支判断

一,多分支结构 某些场景下,判断条件不止一个,可能有多个。 语法格式(下图左): *需要注意:这里仅是以5种选择作为例子, 可以根据自己的需要,在if...else的中间插入任意…

OrangePi AIpro 香橙派 昇腾 Ascend C 算子开发 与 调用 - Tiling实现

OrangePi AIpro 香橙派 昇腾 Ascend C 算子开发 与 调用 - Tiling实现 flyfish 前置知识 基于Kernel直调工程的算子开发流程图 其中有一个Tiling实现 什么是Tiling、Tiling实现 计算API,包括标量计算API、向量计算API、矩阵计算API,分别实现调用S…

51单片机-串口通信(电脑向串口助手发送数据不接收)

80C52中的串口通过SCON寄存器配置波特率位可变的,因此,需要通过计算定时器1的参与,在定时器配置过程中选择定时器的相关寄存器TMOD来配置定时器的模式为模式2(8位自动重装定时器,如上图,TL1为计数器&#x…

SpringBoot动态配置Nacos

重要知识点 Nacos属性的简单使用 将SpringBoot中的所有配置全部放入到Nacos中 开发人创建单独的命名空间,修改互不影响 Nacos经常变动的配置抽离到外部文件中 将项目中的所有配置全部放到到 1. 首先引入包 <!-- nacos 接入--><!-- https://mvnrepository.com/artifact…

网络安全服务基础Windows--第14节-数字签名

散列函数&#xff08;Hash Function&#xff09;&#xff0c;也称为哈希函数&#xff0c;是密码学中⼀个重要的⼯具。它能够将任意⻓度的输⼊数据转换为固定⻓度的输出&#xff08;散列值或哈希值&#xff09;。这种转换过程具有单向性&#xff0c;即很难从输出推断出输⼊&…

uniapp scroll-view滚动页面

页面滚动固定距离&#xff08;scrollTop&#xff09; <template><view><button click"Test">测试</button><scroll-view style"height: 100px;" :scroll-top"scrollTop" scroll-y"true" class"scrol…

大数据-116 - Flink DataStream Sink 原理、概念、常见Sink类型 配置与使用 附带案例1:消费Kafka写到Redis

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

Cadence Virtuoso添加工艺库、转换工艺库格式

系统环境&#xff1a;Red Hat 操作软件&#xff1a;Virtuoso 工艺库&#xff1a;tsmc18rf 1、准备好工艺库文件&#xff0c;放在任意文件夹内&#xff0c;记住文件路径&#xff1a; 2、打开Virtuoso软件&#xff1a; 在桌面右键打开终端&#xff0c;输入&#xff1a; virtuo…

Web3D 技术发展瓶颈在哪里?

Web3D 技术的发展瓶颈主要集中在以下几个方面&#xff1a; 1、性能和优化&#xff1a;尽管现代浏览器和硬件逐步提高了性能&#xff0c;但高质量的3D渲染仍可能导致性能瓶颈。特别是在移动设备上&#xff0c;图形渲染和计算可能会受到限制。建议合理控制好项目资源量&#xff…

DataGridView用法合集【精品】

1.当前的单元格属性取得、变更 [VB.NET] Console.WriteLine(DataGridView1.CurrentCell.Value) Console.WriteLine(DataGridView1.CurrentCell.ColumnIndex) Console.WriteLine(DataGridView1.CurrentCell.RowIndex) DataGridView1.CurrentCell DataGridView1(0, 0) [C#] Con…

毕业设计选题系统

一、项目概述 Hi&#xff0c;大家好&#xff0c;今天分享的项目是《毕业设计选题系统》。 毕业论文选题是大学教学管理中的重要环节&#xff0c;关系到高校的教学质量。传统的手工管理方式工作效率低下、管理繁琐&#xff0c;浪费教师和学生的时间与精力的问题。本系统以提高…

鸿蒙HarmonyOS使用地图服务

1. 生成签名证书指纹 按照步骤生成签名证书指纹 步骤1&#xff1a; 步骤2&#xff1a; 步骤3&#xff1a;Key store file为生成的*.p12文件的存储路径&#xff0c;可以自己选择路径并自定义文件名&#xff0c;输入并确认密码后&#xff0c;点击确认 步骤4&#xff1a;Key s…

代码随想录算法day28 | 动态规划算法part01 | 理论基础、509. 斐波那契数、70. 爬楼梯、 746. 使用最小花费爬楼梯

理论基础 什么是动态规划 动态规划&#xff0c;英文&#xff1a;Dynamic Programming&#xff0c;简称DP&#xff0c;如果某一问题有很多重叠子问题&#xff0c;使用动态规划是最有效的。 所以动态规划中每一个状态一定是由上一个状态推导出来的&#xff0c;这一点就区分于贪…

关于位结构体及位操作总结

#include <stdio.h> #pragma pack(1) struct stu{char a:4; // a占用char的低4位 char b:4; // b占用char的高4位&#xff08;注意&#xff0c;这里实际上是与a共享同一个char的空间&#xff09; }; #pragma pack(4) int main() {struct stu s{.a2, //a:0010.b3, …

如何对单片机程序进行加密(防止别人破解)

单片机程序的破解无非就是非法途径获得源代码或者可执行文件&#xff08;hex文件&#xff09;。本文主要介绍两个方法防止别人从单片机fash中获取可执行文件&#xff08;hex文件&#xff09;。一方面保证别人不能获取你的hex文件&#xff0c;另一面就算别人非法获取你的hex文件…

Windows下的Redis启动报错Redis service failed to start

报错原因&#xff1a;Redis服务没有找到log文件 解决方案&#xff1a; 1、在Redis目录下打开redis.windows-service.conf文件 2、找到logfile存放目录&#xff0c;一般默认为Logs/redis_log.txt 3、在Redis目录创建Logs文件夹&#xff0c;在Logs文件夹下创建redis_log.txt文件…

工业图像输出卡设计原理图:FMC214-基于FMC兼容1.8V IO的Full Camera Link 输出子卡

FMC214-基于FMC兼容1.8V IO的Full Camera Link 输出子卡 一、板卡概述   基于FMC兼容1.8V IO的Full Camera Link 输出子卡支持Base、Middle、Full Camera link信号输出&#xff0c;兼容1.8V、2.5V、3.3V IO FPGA信号输出。适配xilinx不同型号开发板和公司内部各FMC载板。板…

Flutter修改Android包名

一、前言 我在将Android打包上传到google商店的时候提示我“com.example”已受到限制&#xff0c;请换一个软件包名称。“的错误。因此我们需要去修改flutter的Android包名。 二、操作流程 1.修改路径 android ——> app ——> src ——> debug ——> AndroidMa…

LearnOpenGL学习笔记

LearnOpenGL学习笔记 入门认识OpenGL核心模式和立即渲染模式扩展状态机对象 创建窗口视口渲染循环释放资源输入事件渲染 你好&#xff0c;三角形基本概念顶点输入顶点着色器编译着色器片段着色器链接顶点属性顶点数组对象索引缓冲对象 着色器GLSL数据类型输入与输出Uniform 纹理…

深度学习从入门到精通——yolov3算法介绍

YOLO v3 论文地址&#xff1a;https://pjreddie.com/media/files/papers/YOLOv3.pdf论文&#xff1a;YOLOv3: An Incremental Improvement 先验框 (1013)&#xff0c;(1630)&#xff0c;(3323)&#xff0c;(3061)&#xff0c;(6245)&#xff0c;(59 119)&#xff0c; (116 9…