VS+C#+WPF monitoreo de reproductor de cámara de video de subprocesos múltiples

Ejemplos de programas destacados

Supervisión del reproductor de cámara de vídeo multiproceso C#+WPF

Si necesita instalar el entorno operativo o la depuración remota, consulte la tarjeta de presentación QQ personal en la parte inferior del artículo, ¡y el personal profesional y técnico lo ayudará de forma remota!

prefacio

Este blog escribe código para <<C#+WPF monitoreo de reproductor de cámara de video de subprocesos múltiples>>, el código es limpio, regular y fácil de leer. La primera opción para el aprendizaje y la recomendación de aplicaciones.

¿Por qué necesita usar subprocesos múltiples? Los subprocesos múltiples son la función de algoritmo principal de la captura y reproducción remota de video para evitar congelamientos, pantallas negras, pantallas azules y pantallas borrosas. Por lo tanto, la función de algoritmo de subprocesos múltiples de captura de video remota y la reproducción es un método que debe adoptarse.


Directorio de artículos

1. Software de herramienta requerido

2. Usar pasos

        1. Importar biblioteca

        2. Implementación del código

        3. Ejecución de resultados

3. Asistencia en línea

1. Software de herramienta requerido

1. VS,WPF

2. CV abierto

2. Usar pasos

1. Importar biblioteca

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. Implementación del código

el código se muestra a continuación:

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. Ejecución de resultados

 

3. Asistencia en línea:

Si necesita instalar el entorno operativo o la depuración remota, consulte la tarjeta de presentación QQ personal en la parte inferior del artículo, ¡y el personal profesional y técnico lo ayudará de forma remota!
1) Entorno de instalación y operación remota, depuración de código
2) Qt, C++, guía de entrada de Python
3) Embellecimiento de la interfaz
4) Producción de software

Artículo recomendado por Blogger: Formulario qt de estadísticas de reconocimiento facial de Python - CSDN Blog

Artículo recomendado por Blogger: Uso compartido de código fuente de reconocimiento de humo de llama de Python Yolov5 - Blog de CSDN

                         Python OpenCV reconoce el número de personas que entran y salen de la entrada peatonal - Python reconoce el número de personas - CSDN Blog

Página de inicio del blog personal: alicema1111's blog_CSDN blog-Python, C++, bloggers en el campo de las páginas web

Haga clic aquí para ver todos los artículos de los bloggers : alicema1111's blog_CSDN blog-Python, C++, bloggers en el campo de las páginas web

Supongo que te gusta

Origin blog.csdn.net/alicema1111/article/details/131227768
Recomendado
Clasificación