解决C#+EmguCV播放视频时的内存增长问题_c# emgu释放_光谷码农的博客-程序员宅基地

技术标签: C#  c#  图像处理  

        最近有个C#项目要播放本地视频,想想还是用EmguCV较为方便,然后发现了EmguCV的内存管理问题,在播放视频的过程中,内存在一直增加,以为应该有个释放内存的函数啥的,但是在网上搜索半天没有找到结果。于是自己摸索着增加了个垃圾强制回收GC.Collect(),没想到问题就解决了,播放视频内存稳稳的,不再增长,应用到项目中一切正常。

      大家有没有遇到这个问题呢?

      以下是一段测试代码,大家可以试试看是不是这样

using Emgu.CV;
using System;
using System.Diagnostics;
using System.Drawing;
using System.Threading;
using System.Windows.Forms;

namespace WindowsFormsApp4
{
    public partial class Form1 : Form
    {
        Emgu.CV.VideoCapture vc=null;
        Bitmap bitmap;
        int fps = 25;

        public Form1()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 打开文件开始播放
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog openFileDialog = new OpenFileDialog();
            openFileDialog.Filter = "视频文件(*.mp4;*.avi)|*.MP4;*.avi";
            if (openFileDialog.ShowDialog() == DialogResult.OK)
            {
                if (vc != null && vc.IsOpened)
                    vc.Dispose();
                vc = new Emgu.CV.VideoCapture(openFileDialog.FileName);
                fps = (int)vc.GetCaptureProperty(Emgu.CV.CvEnum.CapProp.Fps);
                Thread thread = new Thread(VideoPlayThread);
                thread.Start();
            }
        }

        /// <summary>
        /// 播放线程
        /// </summary>
        private void VideoPlayThread()
        {
            Stopwatch sw = new Stopwatch();
            while (true)
            {
                sw.Restart();
                Mat mat  = vc.QueryFrame();
                this.Invoke((Action)delegate
                {
                    pictureBox1.Image = mat.Bitmap;
                });
                GC.Collect(); //强制进行垃圾回收
                sw.Stop();
                long time = 1000 / fps - sw.ElapsedMilliseconds;
                if (time > 0)
                    Thread.Sleep((int)time);
            }
        }
    }
}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/whf227/article/details/120740328

智能推荐

CH2_算法性能分析_找出第k小的元素_7-8 (选做) 第k小_rusaki的博客-程序员宅基地

问题描述:(必做)给定一个乱序数字列表,编写一个算法复杂度是O(nlogn)的算法,找出第k小的元素;(选做)针对该问题,能将算法的时间复杂度优化到线性阶?请说明思路!要求:(1)编写程序,能够打印数字列表和第k小的元素,给出程序以及输出截图 (2)算法复杂度可以借助画图/表格/文字等形式表现,必须要有自己的分析我的答案:..._7-8 (选做) 第k小

C# label中text属性的&字符显示_c# lab怎么显示符号与-程序员宅基地

&被用于作为加速键提示字符,所以要连写两个&&_c# lab怎么显示符号与

vue路由参数发生变化,但是页面不刷新的问题(vue监听路由参数变化重新渲染页面)_vue 路由参数变化,但是页面不刷新-程序员宅基地

例:地址1:"https://xxx/#/autoPage?channelCode=xuezhiyuan_jc111"地址2:"https://xxx/#/autoPage?channelCode=xuezhiyuan_jc222"问题现象:当从第一个调到第二个地址时,页面内容不进行刷新,依然停留在地址1的内容,但是地址栏会变化为地址二。解决方式:vue 的key htt..._vue 路由参数变化,但是页面不刷新

测试工具Fiddler(三)—— 常见功能介绍-程序员宅基地

Fiddler的功能面板1、statistics:请求的性能指标;全世界范围的性能测试;RTP:一个请求的从发送出去到返回的时间;Show chart可以看出图表的示例;2、inspectors:对请求解包:header:请求头信息。UA,cookie,发送请求来源。textView:可以看到返回的数据;imageview:可以看到返回的图片(如果有图片返回的话)we..._fiddler map

Ubuntu 18.04 离线安装Docker_ubuntu18.04离线安装docker教程_JD.WU的博客-程序员宅基地

1、下载离线包,网址:https://download.docker.com/linux/ubuntu/dists/xenial/pool/stable/amd64/离线安装docker需要下载3个包,containerd.io ,docker-ce-cli,docker-ce2、下载完毕后拷贝到ubuntu上用 dpkg 命令安装,先安装 containerd.io 跟 docker-ce-cli,最后安装docker-ce,命令 sudo apt-get update sudo ..._ubuntu18.04离线安装docker教程

随便推点

GNU GLOBAL (gtags) 的常规使用_gtags.files-程序员宅基地

最常见的用法就是在源码的根目录下执行命令gtags 之后,如果想生成代码的hypertext,可以用htags。如果对参数配置不熟悉,可以用--suggesthtags --suggest_gtags.files

uC/OS-II学习笔记(一)嵌入式实时系统介绍-程序员宅基地

操作系统的主要功能:任务调度(处理器管理),内存管理,设备管理,文件管理,网络通信管理,提供用户接口。嵌入式系统的定义:嵌入式系统是对对象进行自动控制而使其具有智能化并可嵌入对象体系中的专用计算机系统。嵌入式系统的特点:1、专用性强,通常面向某个特定应用,其硬件为特定用户群来设计。2、可裁剪性好,其硬件和软件可根据用户实际应用需要设计,去除冗余功能,使其能满足应用要求的情况下达到最精简的配置。3、...

二级D触发器应用于同步器,减少亚稳态-程序员宅基地

关于同步器为什么需要二级D触发器的疑问 上周,在做VGA接口显示实验时,框图中的同步器引起了我的注意。从理论上说,一级同步器已经能够实现同步,为什么还要使用两级同步器呢?首先,我想说理论与实际是有差距的,理论上在数字电路上的触发器都是稳态的,要么为0,要么为1,因此理论上说一级同步就够了,可实际上,除了高电平和低电平,同步器在建立时间或保持时间得不到满足的情况下,会进入亚稳态。亚稳态通

资料-程序员宅基地

http://www.52caml.com/head_first_ml/ml-chapter9-factorization-family/ https://yxzf.github.io/2017/03/dnn-for-ctr/ http://www.52cs.org/?p=1046 https://tech.meituan.com/deep-understanding-of-ffm-princ

c++---------数据结构—堆-----堆排序-程序员宅基地

这里只说一点,根据一个大小为n的数组,然后进行批量的建堆;其用的是Floyd算法,它首先在LastInetral_node=(n-2)>>1;然后依次遍历其内点,然后进行下滤算法:(图借用邓俊辉的数据结构) 可以看出,其时间复杂度为:一颗n个节点的完全二叉树,其内部节点为K= n/2 - 1;从而就需...