OpenCVSharp入门教程 基础篇④——从本地视频文件获取媒体流

一、界面布局

  • 两个Button
  • 一个PictureBox
  • 一个BackgroundWorker cameraWorker
    在这里插入图片描述

二、功能实现

2.1 打开视频文件

  • 打开文件夹
  • 选择视频文件
  • 判断文件是否打开,否:提示并退出
  • 文件后台任务fileWorker开始运行
private void openFileBtn_Click(object sender, EventArgs e)
        {
            if (fileWorker.IsBusy)
            {
                closeFile();
            }
            else
            {
                openFile();
            }
        }

        private void openFile()
        {
            OpenFileDialog openfiledialog = new OpenFileDialog();
            //openfiledialog.Title = "打开文本文件";
            openfiledialog.Filter = "All Files(*.*)|*.*|mp4 Files(*.mp4)|*.mp4";
            openfiledialog.FilterIndex = 2;//根据文件类型索引设置文件过滤类型
            openfiledialog.RestoreDirectory = true;//设置对话框是否记忆之前打开的目录
            if (openfiledialog.ShowDialog() == DialogResult.OK)
            {
                Console.WriteLine(openfiledialog.FileName);
                capture.Open(openfiledialog.FileName, VideoCaptureAPIs.ANY);
                if (!capture.IsOpened())
                {
                    Close();
                    MessageBox.Show("打开视频文件失败");
                    return;
                }
                openFileBtn.Text = "关闭视频文件";
                fileWorker.RunWorkerAsync();
            }
        }

        private void closeFile()
        {
            openFileBtn.Text = "打开视频文件";
            fileWorker.CancelAsync();
            capture.Release();
            pictureBox1.Image = null;
        }

2.2 运行文件后台任务

  • while死循环
  • 获取文件frameMat
  • 判断frameMat是否为空,是:则跳出循环
  • 转换成Bitmap
  • 复制给pictureBox1
private void fileWorker_DoWork(object sender, DoWorkEventArgs e)
{
    int sleepTime = (int)Math.Round(1000 / capture.Fps);

    var bgWorker = (BackgroundWorker)sender;

    while (!bgWorker.CancellationPending)
    {
        using (var frameMat = capture.RetrieveMat())
        {
            if (frameMat.Empty())
                break;

            var frameBitmap = BitmapConverter.ToBitmap(frameMat);
            bgWorker.ReportProgress(0, frameBitmap);
        }
        Thread.Sleep(sleepTime);
    }
    Console.WriteLine("fileWorker_DoWork end");
}

private void fileWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    var frameBitmap = (Bitmap)e.UserState;

    pictureBox1.Image?.Dispose();
    pictureBox1.Image = frameBitmap;
}

private void fileWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    Console.WriteLine("fileWorker_RunWorkerCompleted");
    openFileBtn.Text = "打开视频文件";
}

三、异常报错

System.TypeInitializationException:““OpenCvSharp.Internal.NativeMethods”的类型初始值设定项引发异常。”

内部异常
DllNotFoundException: 无法加载 DLL“OpenCvSharpExtern”: 找不到指定的模块。 (异常来自 HRESULT:0x8007007E)。

因为还少了一点dll

四、运行

  • 堪称完美

在这里插入图片描述

五、Demo源码

OpenCVSharpDemo工程源码点击下载

觉得好,就一键三连呗(点赞+收藏+关注)

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小康师兄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值