使用EmguCv播放指定视频

用Capture来加载一个视频。
用GetCaptureProperty函数可以获取这个视频的各种属性。
然后用Application.Idle来连续的显示视频中的帧(显示出一帧了,程序进入空闲,就继续加载下一帧)
由于视频中的帧太多,.net的垃圾回收机制赶不上,就使用GC.Collect();来强制回收垃圾,可以把程序的内存占用从700MB降到100MB左右

public partial class Form1 : Form
    {
        Capture cap;
        int fps;
        public Form1()
        {
            InitializeComponent();
            OpenFileDialog openFileDialog = new OpenFileDialog();
            openFileDialog.Filter = "MP4文件|*.mp4|AVI文件|*.avi|RMVB文件|*.rmvb|WMV文件|*.wmv|MKV文件|*.mkv|所有文件|*.*";

            if (openFileDialog.ShowDialog() == DialogResult.OK)
            {
                Application.Idle += Application_Idle;
                cap = new Capture(openFileDialog.FileName);
                fps =(int) cap.GetCaptureProperty(CapProp.Fps);
            }


        }

        private void Application_Idle(object sender, EventArgs e)
        {
            Mat a = cap.QueryFrame();
            if (a != null)
            {
                System.Threading.Thread.Sleep((int)(1000.0 / fps - 5));
                imageBox1.Image = a;

                GC.Collect();
            }

        }

    }

效果图:

你可能感兴趣的:(EmguCV)