C#使用EmguCV播放视频

目录

一、前言

1、简介 

2、测试工程代码下载链接

3、EmguCV 库文件下载链接

二、工程环境配置

1、EmguCV控件添加引用

(1)窗口控件添加

 (2)相关Dll文件添加添加引用

(3)工程运行基础文件夹添加

 (4)调试运行

2、界面设计

(1)整体布局

 (2)设置Image相关属性

 3、添加相应控件事件程序

(1)全局变量

(2)打开影片

(3)播放和暂停


一、前言

1、简介 

 EmguCV是C#版本的OpenCV,EmguCV播放视频主要是将视频解析成一帧帧图像画面。每秒钟显示相对应的帧数画面,即可达到视频播放的效果。本质上是很短的时间显示足够多的图像,因此播放过程中没有影片声音。使用该方式播放视频的优势是可以对视频进行精确播放控制

 播放控制效果

2、测试工程代码下载链接

https://download.csdn.net/download/panjinliang066333/88167836

3、EmguCV 库文件下载链接

https://download.csdn.net/download/panjinliang066333/85711171

二、工程环境配置

1、EmguCV控件添加引用

创建C# Winform工程

(1)窗口控件添加

工具箱中添加EmguCV选项卡,向EmguCV中添加EmguCV.UI控件

 向窗口中添加EmguCV->ImageBox控件,控件背景颜色设置为黑色

 (2)相关Dll文件添加添加引用

(3)工程运行基础文件夹添加

将库文件中的X86文件夹复制到程序工程的Debug或者Release文件夹下。不管是X86系统还是X64系统,都要复制该X86文件夹。

 (4)调试运行

F5或者启动运行,无错误。

2、界面设计

(1)整体布局

 (2)设置Image相关属性

①设置ImageBox控件Enable为False,否则程序运行起来鼠标在控件上滚动会会对图像进行缩放

 ②设置ImageBox控件SizeMode为Zoom,即根据控件大小调整显示的图像对应的尺寸大小

 3、添加相应控件事件程序

(1)全局变量

        private MmTimer userTimer = new MmTimer();  //精确定时器
        Capture cap;
        int fps;                    //影片帧率
        int numFrames;              //影片总帧数
        int videoWidth;             //影片宽度
        int videoHeight;            //影片高度
        int currentFrame = 0;       //当前帧
        double setFrame = 0;        //定位到的帧
        bool isStart = false;       //是否播放

(2)打开影片

        private void btnOpenFile_Click(object sender, EventArgs e)
        {
            try
            {
                //打开视频
                OpenFileDialog openFileDialog = new OpenFileDialog();
                openFileDialog.Filter = "MP4文件|*.mp4|AVI文件|*.avi|RMVB文件|*.rmvb|WMV文件|*.wmv|MKV文件|*.mkv|所有文件|*.*";

                if (openFileDialog.ShowDialog() == DialogResult.OK)
                {
                    txtFileName.Text = openFileDialog.SafeFileName;

                    //
                    //Application.Idle += Application_Idle;         //事件方式
                    cap = new Capture(openFileDialog.FileName);     //读入视频

                    //
                    fps = (int)cap.GetCaptureProperty(CapProp.Fps);                     //获取视频帧率
                    txtFps.Text = fps.ToString();
                    numFrames = (int)cap.GetCaptureProperty(CapProp.FrameCount);        //获取视频总帧数
                    txtFrameNums.Text = numFrames.ToString();
                    videoWidth = (int)cap.GetCaptureProperty(CapProp.FrameWidth);       //获取视频宽度
                    txtWidth.Text = videoWidth.ToString();
                    videoHeight = (int)cap.GetCaptureProperty(CapProp.FrameHeight);     //获取视频高度
                    txtHeight.Text = videoHeight.ToString();
                }
            }
            catch
            {
                MessageBox.Show("操作异常", "提示!!!");
            }
        }

(3)播放和暂停

        private void btnPlay_Click(object sender, EventArgs e)
        {
            if (txtFileName.Text == "")
            {
                MessageBox.Show("请先打开视频");
                return;
            }

            if (btnPlay.Text == "播放")
            {
                isStart = true;
                btnPlay.Text = "暂停";

                //
                cap.SetCaptureProperty(CapProp.PosFrames, currentFrame);
                txtCurrentFrame.Text = currentFrame.ToString();   //当前播放的帧数
                Mat a = cap.QuerySmallFrame();
                imageBox1.Image = a;
                GC.Collect();

                PlayTimeSet();

            }
            else if (btnPlay.Text == "暂停")
            {
                isStart = false;
                btnPlay.Text = "播放";
                userTimer.Stop();
            }
        }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/69169.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Spring】(四)Bean 的作用域和生命周期

文章目录 前言一、Bean 的作用域1.1 被修改的 Bean 案例1.2 作用域的定义1.3 Bean 的六种作用域1.4 Bean 作用域的设置 二、Spring 的执行流程 和 Bean 的生命周期2.1 Spring 的执行流程2.2 Bean 的生命周期2.3 Bean 生命周期的演示 前言 Bean 是 Spring 框架中的一个核心概念…

从支付或退款之回调处理的设计,看一看抽象类的使用场景

一、背景 抽象类,包含抽象方法和实例方法,抽象方法待继承类去实例化,正是利用该特性,以满足不同支付渠道的差异化需求。 我们在做多渠道支付的时候,接收支付或退款的回调报文,然后去处理。这就意味着&…

JVM运行时五大数据区域详解

前言: java虚拟机再执行Java程序的时候把它所拥有的内存区域划分了若干个数据区域。这些区域有着不同的功能,各司其职。这些区域不但功能不同,创建、销毁时间也不同。有些区域为线程私有,如:每个线程都有自己的程序计数…

kubernetes基于helm部署gitlab

kubernetes基于helm部署gitlab 这篇博文介绍如何在 Kubernetes 中使用helm部署 GitLab。 先决条件 已运行的 Kubernetes 集群负载均衡器,为ingress-nginx控制器提供EXTERNAL-IP,本示例使用metallb默认存储类,为gitlab pods提供持久化存储&…

“算法详解”系列第3卷贪心算法和动态规划出版

“算法详解”系列图书共有4卷,目前1到3卷已经出版。最新出版的是第3卷—贪心算法和动态规划。 算法详解 卷3 贪心算法和动态规划 “算法详解”系列图书共有4卷,本书是第3卷—贪心算法和动态规划。其中贪心算法主要包括调度、最小生成树、集群、哈夫曼编…

centos7实现负载均衡

目录 一、基于 CentOS 7 构建 LVS-DR 集群。 1.1 配置lvs负载均衡服务 1.1.1 下载ipvsadm 1.1.2 增加vip 1.1.3 配置ipvsadm 1.2 配置rs1 1.2.1 编写测试页面 1.2.2 手工在RS端绑定VIP、添加路由 1.2.3 抑制arp响应 1.3 配置rs2 1.4 测试 二、配置nginx负载…

Jmeter命令行运行实例讲解

1. 简介 使用非 GUI 模式&#xff0c;即命令行模式运行 JMeter 测试脚本能够大大缩减所需要的系统资 本文介绍windows下以命令行模式运行的方法。 1.1. 命令介绍 jmeter -n -t <testplan filename> -l <listener filename> 示例&#xff1a; jmeter -n -t test…

【数学建模】-- Matlab中图的最短路径

前言&#xff1a; 图的基本概念&#xff1a; 若想简单绘制图可以利用此网站&#xff1a; 左上角Undirected/Directed是无向图/有向图 左边 0-index &#xff0c;1-index为0下标&#xff0c;1下标。 Node Count为节点个数 Graph Data&#xff1a;最初尾节点的名称&#xff…

【什么是应变波齿轮又名谐波驱动?机器人应用的完美齿轮组!?】

什么是应变波齿轮又名谐波驱动&#xff1f;机器人应用的完美齿轮组&#xff01;&#xff1f; 1. 什么是应变波齿轮&#xff1f;2. 工作原理3. 应变波齿轮 – 谐波驱动 3D 模型4. 3D 打印应变波齿轮 – 谐波驱动5. 总结 在本教程中&#xff0c;我们将学习什么是应变波齿轮&#…

第五次作业 运维高级 构建 LVS-DR 集群和配置nginx负载均衡

1、基于 CentOS 7 构建 LVS-DR 群集。 LVS-DR模式工作原理 首先&#xff0c;来自客户端计算机CIP的请求被发送到Director的VIP。然后Director使用相同的VIP目的IP地址将请求发送到集群节点或真实服务器。然后&#xff0c;集群某个节点将回复该数据包&#xff0c;并将该数据包…

ResUNet原理与实现

简述 ResNet是一种非常成功的深度卷积神经网络结构&#xff0c;其具有较强的特征表达能力和较浅的网络深度&#xff0c;使得其在图像分类等任务中表现出了出色的性能。因此&#xff0c;将ResNet作为encoder替换U-Net原始结构&#xff0c;可以使U-Net在图像分割任务中获得更好的…

python爬虫实战(1)--爬取新闻数据

想要每天看到新闻数据又不想占用太多时间去整理&#xff0c;萌生自己抓取新闻网站的想法。 1. 准备工作 使用python语言可以快速实现&#xff0c;调用BeautifulSoup包里面的方法 安装BeautifulSoup pip install BeautifulSoup完成以后引入项目 2. 开发 定义请求头&#xf…

【Windows】Windows开机密码重置

文章目录 前言一、问题描述二、操作步骤2.1 安装DaBaiCai_d14_v6.0_2207_Online.exe2.2 插入U盘2.3 打开大白菜&#xff0c;点击“一键制作USB启动盘”2.4 等待进度条走完2.5 重启电脑&#xff0c;开机按“F12”或者“F8”&#xff08;具体百度一下&#xff0c;对应品牌电脑开机…

Java 成功实现通过网址URL截图保存

Java 实现通过网址URL截图 1.DjNativeSwing方式 &#xff08;不好用&#xff09;2.phantomjs方式 &#xff08;截图还是有瑕疵&#xff09;3.selenium方式 &#xff08;满意&#xff0c;成功实现&#xff09;maven 引入下载相关浏览器chrome下载相关浏览器chromedriver驱动后端…

代码随想录算法训练营第53天|动态规划part11|123. 买卖股票的最佳时机 III、188.买卖股票的最佳时机IV

代码随想录算法训练营第53天&#xff5c;动态规划part11&#xff5c;123. 买卖股票的最佳时机 III、 188.买卖股票的最佳时机IV 123. 买卖股票的最佳时机 III 123. 买卖股票的最佳时机 III 思路&#xff1a; 相比买股票的最佳时机II&#xff0c;限制了买股票的次数&#xf…

Oracle 开发篇+Java调用OJDBC访问Oracle数据库

标签&#xff1a;JAVA语言、Oracle数据库、Java访问Oracle数据库释义&#xff1a;OJDBC是Oracle公司提供的Java数据库连接驱动程序 ★ 实验环境 ※ Oracle 19c ※ OJDBC8 ※ JDK 8 ★ Java代码案例 package PAC_001; import java.sql.Connection; import java.sql.ResultSet…

gitblit windows部署

1.官网下载 往死慢&#xff0c;我是从百度找的1.9.1&#xff0c;几乎就是最新版 http://www.gitblit.com/ 2.解压 下载下来是一个zip压缩包&#xff0c;直接解压即可 3.配置 3.1.配置资源库路径 找到data文件下的gitblit.properties文件&#xff0c;用Notepad打开 **注意路…

Android Ble蓝牙App(三)特性和属性

Ble蓝牙App&#xff08;三&#xff09;特性使用 前言正文一、获取属性列表二、属性适配器三、获取特性名称四、特性适配器五、加载特性六、显示特性和属性七、源码 前言 在上一篇中我们完成了连接和发现服务两个动作&#xff0c;那么再发现服务之后要做什么呢&#xff1f;发现服…

【二】数据库系统

数据库系统的分层抽象DBMS 数据的三个层次从 数据 到 数据的结构----模式数据库系统的三级模式&#xff08;三级视图&#xff09;数据库系统的两层映像数据库系统的两个独立性数据库系统的标准结构 数据模型从 模式 到 模式的结构----数据模型三大经典数据模型 数据库的演变与发…

windows使用/服务(13)戴尔电脑怎么设置通电自动开机

戴尔pc机器通电自启动 1、将主机显示器键盘鼠标连接好后&#xff0c;按主机电源键开机 2、在开机过程中按键盘"F12",进入如下界面&#xff0c;选择“BIOS SETUP” 3、选择“Power Management” 4、选择“AC Recovery”&#xff0c;点选“Power On”&#xff0c;点击“…