VS+C#+WPF多线程视频摄像头播放器监控

news2024/11/24 13:44:44

程序示例精选

C#+WPF多线程视频摄像头播放器监控

如需安装运行环境或远程调试,见文章底部个人QQ名片,由专业技术人员远程协助!

前言

这篇博客针对<<C#+WPF多线程视频摄像头播放器监控>>编写代码,代码整洁,规则,易读。 学习与应用推荐首选。

为什么需要用多线程,多线程是远程视频采集播放主要算法功能,防止卡顿,黑屏,蓝屏,花屏问题,所以远程视频采集播放多线程算法功能是必须采用的一种方法。


文章目录

一、所需工具软件

二、使用步骤

        1. 引入库

        2. 代码实现

        3. 运行结果

三、在线协助

一、所需工具软件

1. VS,WPF

2. OpenCV

二、使用步骤

1.引入库

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

using System.Diagnostics;
using System.IO;
using System.Threading;
using System.Windows.Threading;
using System.Timers;

using System.ComponentModel;

2. 代码实现

代码如下:

public class Thread1Class : System.Windows.Window
{
    // 第一个线程要执行的代码
    //多线程1
    //opencv变量1
    public Mat frameMatT1;

    private volatile bool stopFlag = false;
    private ManualResetEvent pauseSignal = new ManualResetEvent(true);

    

    public void Thread1Function()
    {
        try
        {
            // 在这里编写第一个线程要执行的代码
            Console.WriteLine("capture0");
            // 在这里编写要在UI线程上执行的操作
            VideoCapture capture1 = new VideoCapture();
            capture1.Open("aa.mp4", VideoCaptureAPIs.ANY);
            Console.WriteLine("capture00");
            if (capture1.IsOpened())
            {
                Console.WriteLine("capture1");
                // 循环读取视频帧并在图像控件中显示
                while (!stopFlag)
                {
                    Mat frameMat1 = capture1.RetrieveMat();
                    if (!frameMat1.Empty())
                    {
                        //Console.WriteLine("hello111222");

                    }

                    frameMatT1 = new Mat();
                    frameMat1.CopyTo(frameMatT1);

                    // 暂停线程
                    pauseSignal.WaitOne();
                }
                // 释放资源
                capture1.Release();
            }

            
        }
        catch (ThreadAbortException ex)
        {
            // 线程已被终止
        }
    }

}

public class Thread2Class : System.Windows.Window
{
    // 第二个线程要执行的代码
    public void Thread2Function()
    {
        // 在这里编写第二个线程要执行的代码
        Console.WriteLine("Thread2Function");
    }
}



namespace WpfApp1
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    /// 

    public partial class MainWindow : System.Windows.Window
    {

        private Thread1Class thread1Object; //线程1定义
        private Thread2Class thread2Object;  //线程2定义

        private DispatcherTimer _timer11; //计时器定义
        private int _count = 0;     // 计时器已经运行的秒数
        private bool _isPaused = false;    // 标识计时器是否处于暂停状态



        public MainWindow()
        {
            InitializeComponent();

            timer11Init11();

        }

        private void timer11Init11()
        {
            // 创建一个新的计时器对象
            _timer11 = new DispatcherTimer();
            // 设置计时器间隔时间为1秒
            _timer11.Interval = TimeSpan.FromSeconds(0.2);
            // 订阅Tick事件,并将其处理程序设置为我们想要自动执行的函数
            _timer11.Tick += new EventHandler(video_display11);
        }


        private void timerStart11(object sender, RoutedEventArgs e)
        {
            try
            {
                string buttonText = userPC.Content.ToString();
                if (buttonText == "开始")
                {
                    // 启动计时器
                    _timer11.Start();
                    Console.WriteLine("_timerStart");
                    userPC.Content = "暂停";
                }

                if (buttonText == "暂停")
                {
                    // 如果计时器正在运行,则暂停计时器
                    if (_timer11.IsEnabled)
                    {
                        _timer11.Stop();
                        _isPaused = true;
                    }
                    userPC.Content = "恢复";
                }

                if (buttonText == "恢复")
                {
                    // 如果计时器处于暂停状态,则恢复计时器
                    if (_isPaused)
                    {
                        _timer11.Start();
                        _isPaused = false;
                    }
                    userPC.Content = "暂停";
                }
            }
            catch (ThreadAbortException ex)
            {
                // 线程已被终止
            }

        }

        private void myPauseButton_Click(object sender, RoutedEventArgs e)
        {
            // 如果计时器正在运行,则暂停计时器
            if (_timer11.IsEnabled)
            {
                _timer11.Stop();
                _isPaused = true;
            }
        }

        private void myResumeButton_Click(object sender, RoutedEventArgs e)
        {
            // 如果计时器处于暂停状态,则恢复计时器
            if (_isPaused)
            {
                _timer11.Start();
                _isPaused = false;
            }
        }


        private void myStopButton_Click(object sender, RoutedEventArgs e)
        {
            // 停止计时器并重置计时器已运行的秒数
            _timer11.Stop();
            _count = 0;
            timerLabel11.Content = "0";
        }


        //链接计时器
        private void video_display11(object sender, EventArgs e)
        {
            try
            {
                Console.WriteLine("video_display");
                if (thread1Object != null)
                {
                    if (thread1Object.frameMatT1 != null)
                    {
                        Console.WriteLine("video_display0");
                        if (value != null && value.Rows > 0 && value.Cols > 0)
                        {

                        }
                        else
                        {
                            Console.WriteLine("video_close ");
                        }
                    }
                }
                _count++;
                timerLabel11.Content = _count.ToString();
            }
            catch (ThreadAbortException ex)
            {
                // 线程已被终止
            }
        }


        private void videoModel_init11(object sender, RoutedEventArgs e)
        {
            try
            {
                string buttonText = model_init11.Content.ToString();
                if (buttonText == "模型初始化")
                {
                    thread1Object = new Thread1Class();
                    thread1Object.RunThread();
                    Console.WriteLine("RunThread");

                    model_init11.Content = "暂停模型";
                }

                if (buttonText == "暂停模型")
                {
                    model_init11.Content = "恢复模型";
                    thread1Object.PauseThread();
                    
                }

                if (buttonText == "恢复模型")
                {
                    model_init11.Content = "暂停模型";
                    thread1Object.ResumeThread();
                    
                }
            }
            catch (ThreadAbortException ex)
            {
                // 线程已被终止
            }
        }

        private void videoModel_Stop11(object sender, RoutedEventArgs e)
        {
            try
            {
                thread1Object.StopThread();
            }
            catch (ThreadAbortException ex)
            {
                // 线程已被终止
            }
        }

    } //class类结束
}  //namespace结束


3. 运行结果

三、在线协助:

如需安装运行环境或远程调试,见文章底部个人 QQ 名片,由专业技术人员远程协助!
1)远程安装运行环境,代码调试
2)Qt, C++, Python入门指导
3)界面美化
4)软件制作

博主推荐文章:python人脸识别统计人数qt窗体-CSDN博客

博主推荐文章:Python Yolov5火焰烟雾识别源码分享-CSDN博客

                         Python OpenCV识别行人入口进出人数统计_python识别人数-CSDN博客

个人博客主页:alicema1111的博客_CSDN博客-Python,C++,网页领域博主

博主所有文章点这里alicema1111的博客_CSDN博客-Python,C++,网页领域博主

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

el-table点击单元格变成输入框,以及其自动获取焦点失效可能的原因(focus失效)

1.el-table点击单元格变成输入框 这里主要使用了el-table三个自带的方法/属性&#xff1a; <el-table:data"MesTableData"bordercell-click"clickCell":row-class-name"tableRowClassName":cell-class-name"tableCellClassName" …

解决elementUI弹出框关闭后再打开el-select下拉框无法选中的问题

文章目录 一、问题描述&#xff1a;二、问题解决 一、问题描述&#xff1a; 使用的前端UI框架为elementUI。 el-select组件在一个弹框中&#xff0c;打开该弹框&#xff0c;el-select可以正常选中&#xff0c;但是保存弹框中的表单信息关闭弹框后&#xff0c;再打开弹框&…

RT-DETR论文解读与代码

1.概述 目前以大名鼎鼎的YOLO为代表的基于CNN的实时监测网络需要NMS进行后处理&#xff0c;导致不能很好的优化网络&#xff0c;并且网络不够健壮&#xff0c;从而导致检测器的推理速度出现延迟。研究者也分析了Anchor-based和Anchor-free的YOLO的性能&#xff0c;发现Anchor并…

【Java基础篇】方法的使用(方法的重载和递归)

作者简介&#xff1a; 辭七七&#xff0c;目前大一&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a;Java.SE&#xff0c;本专栏主要讲解运算符&#xff0c;程序逻辑控制&#xff0c;方法的使用&…

打造智能生活方式

2个互联网工具与你分享 分享一&#xff1a; 随记单词是一款功能强大的单词记忆和管理应用程序。它为用户提供了便捷的学习工具和智能化的记忆方式&#xff0c;帮助用户轻松有效地记忆和掌握单词。 随记单词的特点之一是个性化记忆计划。用户可以根据自己的学习进度和需求&am…

如何使用MATLAB处理涡度通量数据

MATLAB MATLAB是美国MathWorks公司出品的商业数学软件&#xff0c;用于数据分析、无线通信、深度学习、图像处理与计算机视觉、信号处理、量化金融与风险管理、机器人&#xff0c;控制系统等领域。 MATLAB是matrix&laboratory两个词的组合&#xff0c;意为矩阵工厂&#x…

苹果头显Vision Pro深度解读3 苹果头显visonOS开发指南

1 程序员visonOS开发指南 作为iOS开发者&#xff0c;切换到visionOS开发非常简单啊&#xff0c;过去的一些技术基本上都用得上。目前根据苹果WWDC官方的文档&#xff0c;视频&#xff0c;我们可以知道: 开发语言&#xff0c;使用的是swift object-c c c等&#xff0c;swif…

简化日志数据管理:利用 Elastic 灵活路由的力量

作者&#xff1a;Felix Barnsteiner&#xff0c;Nicolas Ruflin 在 Elasticsearch 8.8 中&#xff0c;我们在技术预览中引入了重新路由处理器&#xff08;reroute processor&#xff09;&#xff0c;它可以根据灵活的路由规则将文档&#xff08;例如日志&#xff09;发送到不同…

Jmeter吞吐量控制器使用小结

吞吐量控制器(Throughput Controller)场景: 在同一个线程组里, 有10个并发, 7个做A业务, 3个做B业务,要模拟这种场景,可以通过吞吐量模拟器来实现.。 添加吞吐量控制器 如果你想学习jmeter性能测试&#xff0c;我这边给你推荐一套视频&#xff0c;这个视频可以说是B站播放全网…

第十六届全国大学生信息安全竞赛CISCN---Cypto

1.Sign_in_passwd 打开环境&#xff0c;下载附件&#xff0c;用记事本打开flag的文件 发现里面是像base密码但又不像base密码的一串&#xff0c;第二行的%&#xff0c;就很像url密码啊&#xff0c;之前做题没接触过啊&#xff0c;还是做题做少了 没有啥解题思路&#xff0c;看…

基于Jeecg-boot的flowable流程支持拒绝同意流程操作

更多功能看演示系统 gitee源代码地址 后端代码&#xff1a; https://gitee.com/nbacheng/nbcio-boot 前端代码&#xff1a;https://gitee.com/nbacheng/nbcio-vue.git 在线演示&#xff08;包括H5&#xff09; &#xff1a; http://122.227.135.243:9888 因为看很多朋友需要…

利用Transformer BEV解决自动驾驶Corner Case的技术原理

摘要&#xff1a; 本文总结了Transformer和BEV技术在自动驾驶中的原理和应用&#xff0c;特别是如何解决Corner Case问题。 自动驾驶系统在实际应用中需要面对各种复杂的场景&#xff0c;尤其是Corner Case&#xff08;极端情况&#xff09;对自动驾驶的感知和决策能力提出了更…

访问者模式(十八)

相信自己&#xff0c;请一定要相信自己 上一章简单介绍了命令模式(十七), 如果没有看过, 请观看上一章 一. 访问者模式 引用 菜鸟教程里面访问者模式介绍: https://www.runoob.com/design-pattern/visitor-pattern.html 在访问者模式&#xff08;Visitor Pattern&#xff09…

大模型入门(六)—— RLHF微调大模型

一、RLHF微调三阶段 参考&#xff1a;https://huggingface.co/blog/rlhf 1&#xff09;使用监督数据微调语言模型&#xff0c;和fine-tuning一致。 2&#xff09;训练奖励模型     奖励模型是输入一个文本序列&#xff0c;模型给出符合人类偏好的奖励数值&#xff0c;这个奖…

大数据技术——用户与组管理

一、实验目的 1.了解linux用户和组 2.熟练掌握liunx用户和组的基本操作 3.进一步了解linux系统 二、实验内容 1.用户账号的添加、删除与修改。 2.用户口令的管理 3.用户组的管理 三、实验原理或流程 Linux系统是一个多用户多任务的分时操作系统&#xff0c;任何一个要使…

阿里面试了7轮...就这么狠的吗?

引言 今年的大环境非常差&#xff0c;互联网企业裁员的现象比往年更严重了&#xff0c;可今年刚好是我的第一个“五年计划”截止的时间点&#xff0c;说什么也不能够耽搁了&#xff0c;所以早早准备的跳槽也在疫情好转之后开始进行了。但是&#xff0c;不得不说&#xff0c;这…

ApacheStreamPark2.1.0部署及执行flink-cdc任务同步mysql表的数据到es的实践

文章目录 [toc] 1.ApacheStreamPark是什么&#xff1f;2.介绍2.1 特性2.2 架构2.3 Zeppelin和StreamPark的对比 3.相关连接4.部署4.1 二进制包编译构建4.2 镜像构建4.3 初始化sql4.4 部署4.4.1 Docker-compose.yaml部署脚本4.4.2 配置文件准备4.4.3 flink启动配置4.4.4 streamp…

7. WebGPU 将图像导入纹理

我们在上一篇文章中介绍了有关使用纹理的一些基础知识。在本文中&#xff0c;我们将介绍从图像导入纹理。 在上一篇文章中&#xff0c;通过调用 device.createTexture 创建了一个纹理&#xff0c;然后通过调用 device.queue.writeTexture 将数据放入纹理中。 device.queue 上还…

从小白到大神之路之学习运维第41天---第三阶段---Redis高可用集群(redis 的主从复制、redis的哨兵模式操作)

第三阶段基础 时 间&#xff1a;2023年6月15日 参加人&#xff1a;全班人员 内 容&#xff1a; Redis高可用集群 目录 一、redis主从复制原理介绍 主从复制特点&#xff1a; 主从复制实现原理&#xff1a; 二、主从复制实现操作&#xff08;多机实例实现&#xff09…

Mysql 表的七种联接方式【附带练习sql】

联接 七种JOIN介绍 图形联接方式说明SQL内联接共有部分SELECT <select_list> FROM TableA A INNER JOIN TableB B ON A.Key B.Key;左联接A表独有共有部分SELECT <select_list> FROM TableA A LEFT JOIN TableB B ON A.Key B.Key;右联接B表独有共有部分SELECT &…