Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 简单的Emgucv网络摄像头提要似乎存在内存泄漏_Vb.net_Opencv_Memory Leaks_Emgucv - Fatal编程技术网

Vb.net 简单的Emgucv网络摄像头提要似乎存在内存泄漏

Vb.net 简单的Emgucv网络摄像头提要似乎存在内存泄漏,vb.net,opencv,memory-leaks,emgucv,Vb.net,Opencv,Memory Leaks,Emgucv,以下代码是我在一个更大的项目中从网络摄像头检索帧的方法: Imports Emgu.CV Imports Emgu.CV.CvEnum Imports Emgu.CV.Structure Imports Emgu.CV.UI Imports Emgu.CV.Util Public Class Form1 Dim img As Mat Dim cam As VideoCapture Private Sub Form1_Load(sender As Object, e

以下代码是我在一个更大的项目中从网络摄像头检索帧的方法:

Imports Emgu.CV
Imports Emgu.CV.CvEnum
Imports Emgu.CV.Structure
Imports Emgu.CV.UI
Imports Emgu.CV.Util

Public Class Form1

    Dim img As Mat
    Dim cam As VideoCapture

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        Try
            cam = New VideoCapture(0)
        Catch ex As Exception
            'show error via message box
            MessageBox.Show("unable To read from webcam, error: " + Environment.NewLine + Environment.NewLine +
                                ex.Message + Environment.NewLine + Environment.NewLine +
                                "Try another")
            Return
        End Try

        AddHandler Application.Idle, New EventHandler(AddressOf Me.ProcessFrame)

    End Sub

    Sub ProcessFrame(sender As Object, arg As EventArgs)

        img = cam.QueryFrame()
        ImageBox1.Image = img

    End Sub

End Class
基本上,它从网络摄像头抓取一个框架,并将其插入表单上的图像框中。运行代码时,我的内存消耗如下所示:


我从中得出的结论是,有些东西没有得到适当的处理,但我不知道它是什么。网络摄像头的MP越多,内存峰值越高。加载本地视频文件时也是如此。

正如您在链接图像中看到的那样,内存消耗仅由垃圾收集器(GC)减少,垃圾收集器是基于固定的时间周期(因此振荡)执行的。
您的代码进入ProcessFrame(),而不释放捕获设备。我建议使用[VideoCapture].release()来解决这个问题。如果您需要一致的帧速率,则无法避免这些内存峰值

正如您在链接映像中所看到的,内存消耗仅由垃圾收集器(GC)减少,垃圾收集器是基于固定的时间周期执行的(因此是振荡)。
您的代码进入ProcessFrame(),而不释放捕获设备。我建议使用[VideoCapture].release()来解决这个问题。如果您需要一致的帧速率,则无法避免这些内存峰值

读取帧是视频处理中最慢的部分之一。您的最小示例不足以帮助解决内存泄漏(如果确实存在)。确保不要在循环中重复创建videocapture对象。

读取帧是视频处理中最慢的部分之一。您的最小示例不足以帮助解决内存泄漏(如果确实存在)。确保没有在循环中重复创建videocapture对象。

实现
IDisposable
。在显示新映像之前对旧映像调用
Dispose()
,可能有助于最小化峰值,但正如Lucas K提到的,在GC运行之前,并不能保证所有内容都完全释放

img = cam.QueryFrame()

'Dispose of the old image (if one exists).
If ImageBox1.Image IsNot Nothing Then ImageBox1.Image.Dispose()

ImageBox1.Image = img
一般来说,当您使用完所有实现了
IDisposable
的类(或在适用的情况下将它们包装起来)时,您应该对这些类调用
Dispose()

实现了
IDisposable
。在显示新映像之前对旧映像调用
Dispose()
,可能有助于最小化峰值,但正如Lucas K提到的,在GC运行之前,并不能保证所有内容都完全释放

img = cam.QueryFrame()

'Dispose of the old image (if one exists).
If ImageBox1.Image IsNot Nothing Then ImageBox1.Image.Dispose()

ImageBox1.Image = img

一般来说,当您使用完所有实现了
IDisposable
的类(或在适用的情况下将它们包装起来)时,您应该对它们调用
Dispose()

释放视频捕获将关闭它(相机流)。你不想那样做。视频捕获初始化一次,并反复查询以获取帧,直到完成。释放视频捕获将关闭它(相机流)。你不想那样做。视频捕获初始化一次,并反复查询以获取帧,直到完成。谢谢!内存使用线现在相当平坦。@observer:很高兴我能帮上忙!祝你的项目好运@VisualVicent,您好,我尝试了您的解决方案,但引发了以下异常:“System.AccessViolationException:'尝试读取或写入受保护的内存。这通常表示其他内存已损坏。”@Achutaperumalrk:您好!很抱歉没有看到你的评论,我已经有一段时间没有讨论堆栈溢出了。不幸的是,这种错误极难诊断,并且在处理非托管代码时(EmguCV就是这样做的)通常会抛出。您可能做了一些错误或不正常的事情,但也可能是库本身没有正确编码,在某些情况下会中断。@Achutaperumalrk:恐怕我能给您的唯一故障排除提示就是只使用最基本的代码设置一个新项目,看看是否仍然发生错误。如果没有,请添加越来越多的代码,并尝试找出导致代码中断的具体差异。如果您找不到解决方案,请在此处发布问题并描述您采取的步骤。谢谢!内存使用线现在相当平坦。@observer:很高兴我能帮上忙!祝你的项目好运@VisualVicent,您好,我尝试了您的解决方案,但引发了以下异常:“System.AccessViolationException:'尝试读取或写入受保护的内存。这通常表示其他内存已损坏。”@Achutaperumalrk:您好!很抱歉没有看到你的评论,我已经有一段时间没有讨论堆栈溢出了。不幸的是,这种错误极难诊断,并且在处理非托管代码时(EmguCV就是这样做的)通常会抛出。您可能做了一些错误或不正常的事情,但也可能是库本身没有正确编码,在某些情况下会中断。@Achutaperumalrk:恐怕我能给您的唯一故障排除提示就是只使用最基本的代码设置一个新项目,看看是否仍然发生错误。如果没有,请添加越来越多的代码,并尝试找出导致代码中断的具体差异。如果你找不到解决方案,在这里贴一个问题,并描述你采取的步骤。