VS+C#+WPF multi-threaded video camera player monitoring

Featured program examples

C#+WPF multi-threaded video camera player monitoring

If you need to install the operating environment or remote debugging, see the personal QQ business card at the bottom of the article, and professional and technical personnel will assist remotely!

foreword

This blog writes code for <<C#+WPF multi-threaded video camera player monitoring>>, the code is neat, regular and easy to read. The first choice for learning and application recommendation.

Why do we need to use multi-threading? Multi-threading is the main algorithm function of remote video capture and playback to prevent freeze, black screen, blue screen, and blurred screen problems. Therefore, the multi-thread algorithm function of remote video capture and playback is a method that must be adopted.


Article directory

1. Required tool software

2. Use steps

        1. Import library

        2. Code implementation

        3. Running results

3. Online assistance

1. Required tool software

1. VS,WPF

2. OpenCV

2. Use steps

1. Import library

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. Code implementation

code show as below:

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. Running results

 

3. Online assistance:

If you need to install the operating environment or remote debugging, see the personal QQ business card at the bottom of the article, and professional and technical personnel will assist remotely!
1) Remote installation and operation environment, code debugging
2) Qt, C++, Python entry guide
3) Interface beautification
4) Software production

Blogger recommended article: python face recognition statistics qt form - CSDN Blog

Blogger recommended article: Python Yolov5 flame smoke recognition source code sharing - CSDN blog

                         Python OpenCV recognizes the number of people entering and exiting the pedestrian entrance - python recognizes the number of people - CSDN Blog

Personal blog homepage: alicema1111's blog_CSDN blog-Python, C++, bloggers in the field of web pages

Click here for all the blogger's articles : alicema1111's blog_CSDN blog-Python, C++, bloggers in the field of web pages

Guess you like

Origin blog.csdn.net/alicema1111/article/details/131227768