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

柔情只为你懂 2023-01-23 09:54 113阅读 0赞

文章目录

  • 一、界面布局
  • 二、功能实现
    • 2.1 打开视频文件
    • 2.2 运行文件后台任务
  • 三、异常报错
  • 四、运行
  • 五、Demo源码

一、界面布局

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

二、功能实现

2.1 打开视频文件

  • 打开文件夹
  • 选择视频文件
  • 判断文件是否打开,否:提示并退出
  • 文件后台任务fileWorker开始运行

    private void openFileBtn_Click(object sender, EventArgs e)

    1. {
    2. if (fileWorker.IsBusy)
    3. {
    4. closeFile();
    5. }
    6. else
    7. {
    8. openFile();
    9. }
    10. }
    11. private void openFile()
    12. {
    13. OpenFileDialog openfiledialog = new OpenFileDialog();
    14. //openfiledialog.Title = "打开文本文件";
    15. openfiledialog.Filter = "All Files(*.*)|*.*|mp4 Files(*.mp4)|*.mp4";
    16. openfiledialog.FilterIndex = 2;//根据文件类型索引设置文件过滤类型
    17. openfiledialog.RestoreDirectory = true;//设置对话框是否记忆之前打开的目录
    18. if (openfiledialog.ShowDialog() == DialogResult.OK)
    19. {
    20. Console.WriteLine(openfiledialog.FileName);
    21. capture.Open(openfiledialog.FileName, VideoCaptureAPIs.ANY);
    22. if (!capture.IsOpened())
    23. {
    24. Close();
    25. MessageBox.Show("打开视频文件失败");
    26. return;
    27. }
    28. openFileBtn.Text = "关闭视频文件";
    29. fileWorker.RunWorkerAsync();
    30. }
    31. }
    32. private void closeFile()
    33. {
    34. openFileBtn.Text = "打开视频文件";
    35. fileWorker.CancelAsync();
    36. capture.Release();
    37. pictureBox1.Image = null;
    38. }

2.2 运行文件后台任务

  • while死循环
  • 获取文件frameMat
  • 判断frameMat是否为空,是:则跳出循环
  • 转换成Bitmap
  • 复制给pictureBox1

    private void fileWorker_DoWork(object sender, DoWorkEventArgs e)
    {

    1. int sleepTime = (int)Math.Round(1000 / capture.Fps);
    2. var bgWorker = (BackgroundWorker)sender;
    3. while (!bgWorker.CancellationPending)
    4. {
    5. using (var frameMat = capture.RetrieveMat())
    6. {
    7. if (frameMat.Empty())
    8. break;
    9. var frameBitmap = BitmapConverter.ToBitmap(frameMat);
    10. bgWorker.ReportProgress(0, frameBitmap);
    11. }
    12. Thread.Sleep(sleepTime);
    13. }
    14. Console.WriteLine("fileWorker_DoWork end");

    }

    private void fileWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {

    1. var frameBitmap = (Bitmap)e.UserState;
    2. pictureBox1.Image?.Dispose();
    3. pictureBox1.Image = frameBitmap;

    }

    private void fileWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {

    1. Console.WriteLine("fileWorker_RunWorkerCompleted");
    2. openFileBtn.Text = "打开视频文件";

    }

三、异常报错

  1. System.TypeInitializationException:““OpenCvSharp.Internal.NativeMethods”的类型初始值设定项引发异常。”
  2. 内部异常
  3. DllNotFoundException: 无法加载 DLLOpenCvSharpExtern”: 找不到指定的模块。 (异常来自 HRESULT:0x8007007E)。

因为还少了一点dll

  • 点击下载OpenCVSharp dll.zip
  • 放到\bin\Debug\下面
    在这里插入图片描述

四、运行

  • 堪称完美

在这里插入图片描述

五、Demo源码

OpenCVSharpDemo工程源码点击下载

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

发表评论

表情:
评论列表 (有 0 条评论,113人围观)

还没有评论,来说两句吧...

相关阅读