c# - 使用 EmguCV QueryGrayFrame() 处理视频时如何修复此内存不足异常

标签 c# video out-of-memory video-capture emgucv

我已经研究了一段时间了,但仍然找不到问题的根源。

首先,请注意,所有视频每个时长 15 秒,总共 450 帧。稍后将帧大小调整为 50x50。

使用 EmguCv,我使用以下例程来获取视频的所有帧:

public void PopulateAllFrames()
    {
        int FramesCount = 0;

        try
        {                 
            FramesCount = (int)capture.GetCaptureProperty(Emgu.CV.CvEnum.CAP_PROP.CV_CAP_PROP_FRAME_COUNT);

            for (int i = 0; i < FramesCount; i++)
            {
                var frame = capture.QueryGrayFrame(); // Error here
                var resized = frame.Resize(ImageWidth, ImageHeight, Emgu.CV.CvEnum.INTER.CV_INTER_LINEAR);
                AllFrames.Add(resized.Copy());
            }

            capture.Dispose();
            GC.Collect();
        }
        catch (Exception ex)
        { }
    }

当我通过单击按钮加载任何视频时,上述效果很好:

private void SelectAVideo_Click(object sender, EventArgs e)
{
    try
    {
        OpenFileDialog OpenFile = new OpenFileDialog();

        if (OpenFile.ShowDialog() == System.Windows.Forms.DialogResult.OK)
        {            
            OriginalVideo = new MyVideo(OpenFile.FileName, true);

            OriginalVideo.PopulateAllFrames();     
    }
    catch (Exception ex)
    {}
}

但当我加载包含 25 个视频的目录时,它无法对某些视频起作用。通过的视频每次都是相同的视频,“错误”的视频每次也相同:

private void LoadDirectory_Click(object sender, EventArgs e)
{ 
    try
    {
        using (var fbd = new FolderBrowserDialog())
        {
            DialogResult result = fbd.ShowDialog();

            if (result == DialogResult.OK && fbd.SelectedPath != null)
            {
                AllVideos = new List<MyVideo>();

                AllVideosFileNames = Directory.GetFiles(fbd.SelectedPath).ToList();

                for (int i = 0; i < AllVideosFileNames.Count(); i++) // loop the rest of the videos, start from the 5th video and till the end
                 {
                    MyVideo CurrentVideo = new MyVideo(AllVideosFileNames[i], false);
                    CurrentVideo.PopulateAllFrames();
                    AllVideos.Add(CurrentVideo);

                 } 
    }
    catch (Exception ex)
    { }
}

每当我在同一组视频上执行 QueryGrayFrame() 时,即使我只加载 10 个视频,我也会遇到 OutOfMemoryException 。并且没有模式(意味着错误不会仅在最后 10 个索引上弹出......等等)。知道视频真的很小,如果我单独加载这些视频中的任何一个,它就可以正常工作。

如何解决这个问题?

最佳答案

正如评论中提到的,我只需要 .Dispose() 我的变量,因为我的视频很小,所以我没有想到这一点。事实证明,它们仍然占用了大量内存。所以这样做解决了问题:

for (int i = 0; i < FramesCount; i++)
        {
            var frame = capture.QueryGrayFrame(); // Error here
            var resized = frame.Resize(ImageWidth, ImageHeight, Emgu.CV.CvEnum.INTER.CV_INTER_LINEAR);
            AllFrames.Add(resized.Copy());
            frame.Dispose();
            resized.Dispose();
        } 

关于c# - 使用 EmguCV QueryGrayFrame() 处理视频时如何修复此内存不足异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43566343/

相关文章:

c# - c#中有没有类似java的@override注解的东西?

c# - 为什么可以通过接口(interface)使用 dispose

batch-file - 尝试使用 ffmpeg 将 wav 与视频文件合并

java - 如何解决Java错误 "pool-1-thread-xxxx"java.lang.OutOfMemory

php - 已用完 X 字节的允许内存大小

c# - 使用azure向IOS和android发送广播通知

c# - access数据库中如何查看用户名和密码

python - 使用 openCV cv2VideoCapture 打开视频文件时出错

wpf - 使用 WPF MediaElement 渲染 HDVideo 是否成功? WPF 有更好的视频播放器选项吗?

将图像加载到recyclerview时Android picasso内存不足