C# VideoCapture 多路视频播放

news2025/1/9 6:11:48

目录

效果

项目 

代码

下载


效果

C#VideoCapture多路视频播放

项目 

代码

using OpenCvSharp;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace MultiVideoDemo
{
    public partial class Form4 : Form
    {
        public Form4()
        {
            InitializeComponent();
        }

        CancellationTokenSource ctsShow;
        CancellationTokenSource[] taskCTS = new CancellationTokenSource[6];
        ConcurrentQueue<Mat>[] matQueue = new ConcurrentQueue<Mat>[6];
        int fps = 25;
        string[] rtsp_url = new string[40];
        List<RTSPURLInfo> play_rtsp_url = new List<RTSPURLInfo>();

        /// <summary>
        /// 停止
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button2_Click(object sender, EventArgs e)
        {
            ctsShow.Cancel();

            for (int i = 0; i < 6; i++)
            {
                taskCTS[i].Cancel();
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //初始化
            for (int i = 0; i < 6; i++)
            {
                taskCTS[i] = new CancellationTokenSource();
                matQueue[i] = new ConcurrentQueue<Mat>();
            }

            for (int i = 0; i < 40; i++)
            {
                rtsp_url[i] = "1.dav";
            }

            //play_rtsp_url
            for (int i = 0; i < 6; i++)
            {
                play_rtsp_url.Add(new RTSPURLInfo((i + 1).ToString(), rtsp_url[i]));
            }
        }

        /// <summary>
        /// 播放
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            ctsShow = new CancellationTokenSource();

            for (int i = 0; i < 6; i++)
            {
                taskCTS[i] = new CancellationTokenSource();
                matQueue[i] = new ConcurrentQueue<Mat>();
            }

            play_rtsp_url.Clear();
            for (int i = 0; i < 6; i++)
            {
                play_rtsp_url.Add(new RTSPURLInfo((i + 1).ToString(), rtsp_url[i]));
            }

            for (int i = 0; i < play_rtsp_url.Count; i++)
            {
                Task.Run(() => DecodeRTSP(play_rtsp_url[i].index, matQueue[i], play_rtsp_url[i].url, taskCTS[i].Token));
                System.Threading.Thread.Sleep(100);
            }

            //显示线程
            Task.Run(() =>
            {
                Mat mat = new Mat();
                string winName = "video";

                Cv2.NamedWindow(winName, WindowFlags.Normal);
                Cv2.ResizeWindow(winName, fullSize);

                int delay = (int)(1000 / fps);
                Stopwatch stopwatch = new Stopwatch();

                while (true)
                {
                    stopwatch.Restart();
                    delay = (int)(1000 / fps);
                    if (ctsShow.IsCancellationRequested) break;

                    Mat frame = CombiningImages();

                    Cv2.ImShow(winName, frame);

                    delay = (int)(delay - stopwatch.ElapsedMilliseconds);
                    if (delay <= 0)
                    {
                        delay = 1;
                    }
                    Console.WriteLine("delay:" + delay.ToString());
                    Cv2.WaitKey(delay);

                    frame.Dispose();
                }
                Cv2.DestroyAllWindows();
            });
        }

        OpenCvSharp.Size fullSize = new OpenCvSharp.Size(1008, 570);
        OpenCvSharp.Size mainSize = new OpenCvSharp.Size(672, 380);
        OpenCvSharp.Size subSize = new OpenCvSharp.Size(336, 190);

        Mat CombiningImages()
        {
            Console.WriteLine(string.Format("matQueue0:{0},matQueue1:{1},matQueue2:{2},matQueue3:{3},matQueue4:{4},matQueue5:{5}"
                , matQueue[0].Count
                , matQueue[1].Count
                , matQueue[2].Count
                , matQueue[3].Count
                , matQueue[4].Count
                , matQueue[5].Count
                ));

            Mat mat = Mat.Zeros(fullSize, MatType.CV_8UC3);

            Mat mat0 = new Mat();
            matQueue[0].TryDequeue(out mat0);
            if (mat0 == null || mat0.Empty())
            {
                mat0 = Mat.Zeros(mainSize, MatType.CV_8UC3);
            }
            Cv2.Resize(mat0, mat0, mainSize);

            Mat mat1 = new Mat();
            matQueue[1].TryDequeue(out mat1);
            if (mat1 == null || mat1.Empty())
            {
                mat1 = Mat.Zeros(subSize, MatType.CV_8UC3);
            }
            Cv2.Resize(mat1, mat1, subSize);

            Mat mat2 = new Mat();
            matQueue[2].TryDequeue(out mat2);
            if (mat2 == null || mat2.Empty())
            {
                mat2 = Mat.Zeros(subSize, MatType.CV_8UC3);
            }
            Cv2.Resize(mat2, mat2, subSize);

            Mat mat3 = new Mat();
            matQueue[3].TryDequeue(out mat3);
            if (mat3 == null || mat3.Empty())
            {
                mat3 = Mat.Zeros(subSize, MatType.CV_8UC3);
            }
            Cv2.Resize(mat3, mat3, subSize);

            Mat mat4 = new Mat();
            matQueue[4].TryDequeue(out mat4);
            if (mat4 == null || mat4.Empty())
            {
                mat4 = Mat.Zeros(subSize, MatType.CV_8UC3);
            }
            Cv2.Resize(mat4, mat4, subSize);

            Mat mat5 = new Mat();
            matQueue[5].TryDequeue(out mat5);
            if (mat5 == null || mat5.Empty())
            {
                mat5 = Mat.Zeros(subSize, MatType.CV_8UC3);
            }
            Cv2.Resize(mat5, mat5, subSize);

            //第一张主图
            Rect roi0 = new Rect(0, 0, 672, 380);
            Mat position0 = new Mat(mat, roi0);
            mat0.CopyTo(position0);

            //第二张图
            Rect roi1 = new Rect(672, 0, 336, 190);
            Mat position1 = new Mat(mat, roi1);
            mat1.CopyTo(position1);

            //第三张图
            Rect roi2 = new Rect(672, 190, 336, 190);
            Mat position2 = new Mat(mat, roi2);
            mat2.CopyTo(position2);

            //第4张图
            Rect roi3 = new Rect(672, 380, 336, 190);
            Mat position3 = new Mat(mat, roi3);
            mat3.CopyTo(position3);

            //第5张图
            Rect roi4 = new Rect(336, 380, 336, 190);
            Mat position4 = new Mat(mat, roi4);
            mat4.CopyTo(position4);

            //第6张图
            Rect roi5 = new Rect(0, 380, 336, 190);
            Mat position5 = new Mat(mat, roi5);
            mat5.CopyTo(position5);

            mat0.Dispose();
            mat1.Dispose();
            mat2.Dispose();
            mat3.Dispose();
            mat4.Dispose();
            mat5.Dispose();

            position0.Dispose();
            position1.Dispose();
            position2.Dispose();
            position3.Dispose();
            position4.Dispose();
            position5.Dispose();

            return mat;

        }

        void DecodeRTSP(string index, ConcurrentQueue<Mat> matQueue, string url, CancellationToken cancellationToken = default)
        {
            VideoCapture vcapture = new VideoCapture(url);
            if (!vcapture.IsOpened())
            {
                Console.WriteLine("打开视频文件失败");
                return;
            }

            // 计算等待时间(毫秒)
            int taskDelay = (int)(1000 / fps);
            Stopwatch stopwatch = new Stopwatch();


            while (true)
            {
                if (cancellationToken.IsCancellationRequested) break;

                stopwatch.Restart();
                Mat frame = new Mat();
                if (!vcapture.Read(frame))
                {
                    Console.WriteLine("读取失败");
                    break;
                }

                taskDelay = (int)(1000 / fps);

                //中间标注数字,模拟路数
                Cv2.PutText(frame, index.ToString(), new OpenCvSharp.Point(frame.Width / 2, frame.Height / 2), HersheyFonts.HersheySimplex, 20, Scalar.Red, 20);

                matQueue.Enqueue(frame);

                taskDelay = (int)(taskDelay - stopwatch.ElapsedMilliseconds);
                if (matQueue.Count > 100)
                {
                    Console.WriteLine("index:" + index + ",后续处理能力不足……");
                }

                if (matQueue.Count < 10)
                {
                    taskDelay = taskDelay - 5;
                }

                if (taskDelay <= 0)
                {
                    taskDelay = 0;
                }
                Console.WriteLine("index:" + index + ",taskDelay:" + taskDelay);
                Task.Delay(taskDelay).Wait();

            }

            vcapture.Release();

        }

        /// <summary>
        /// 取消第一路
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button4_Click(object sender, EventArgs e)
        {
            taskCTS[0].Cancel();
        }

        /// <summary>
        /// 记载第7路
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button3_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < 6; i++)
            {
                taskCTS[i].Cancel();
            }

            for (int i = 0; i < 6; i++)
            {
                taskCTS[i] = new CancellationTokenSource();
            }

            //删除最后一个元素
            play_rtsp_url.RemoveAt(play_rtsp_url.Count - 1);

            //把第7路的地址 放到第一的位置
            play_rtsp_url.Insert(0, new RTSPURLInfo("7", rtsp_url[6]));

            for (int i = 0; i < play_rtsp_url.Count; i++)
            {
                Task.Run(() => DecodeRTSP(play_rtsp_url[i].index, matQueue[i], play_rtsp_url[i].url, taskCTS[i].Token));
                System.Threading.Thread.Sleep(10);
            }
        }

        /// <summary>
        /// 加载第8路
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button5_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < 6; i++)
            {
                taskCTS[i].Cancel();
            }

            for (int i = 0; i < 6; i++)
            {
                taskCTS[i] = new CancellationTokenSource();
            }

            //删除最后一个元素
            play_rtsp_url.RemoveAt(play_rtsp_url.Count - 1);

            //把第8路的地址 放到第一的位置
            play_rtsp_url.Insert(0, new RTSPURLInfo("8", rtsp_url[7]));

            for (int i = 0; i < play_rtsp_url.Count; i++)
            {
                Task.Run(() => DecodeRTSP(play_rtsp_url[i].index, matQueue[i], play_rtsp_url[i].url, taskCTS[i].Token));
                System.Threading.Thread.Sleep(10);
            }


        }
    }

    public class RTSPURLInfo
    {
        public string index;
        public string url;

        public RTSPURLInfo(string index, string url)
        {
            this.index = index;
            this.url = url;
        }
    }

}
 

using OpenCvSharp;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace MultiVideoDemo
{
    public partial class Form4 : Form
    {
        public Form4()
        {
            InitializeComponent();
        }

        CancellationTokenSource ctsShow;
        CancellationTokenSource[] taskCTS = new CancellationTokenSource[6];
        ConcurrentQueue<Mat>[] matQueue = new ConcurrentQueue<Mat>[6];
        int fps = 25;
        string[] rtsp_url = new string[40];
        List<RTSPURLInfo> play_rtsp_url = new List<RTSPURLInfo>();

        /// <summary>
        /// 停止
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button2_Click(object sender, EventArgs e)
        {
            ctsShow.Cancel();

            for (int i = 0; i < 6; i++)
            {
                taskCTS[i].Cancel();
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //初始化
            for (int i = 0; i < 6; i++)
            {
                taskCTS[i] = new CancellationTokenSource();
                matQueue[i] = new ConcurrentQueue<Mat>();
            }

            for (int i = 0; i < 40; i++)
            {
                rtsp_url[i] = "1.dav";
            }

            //play_rtsp_url
            for (int i = 0; i < 6; i++)
            {
                play_rtsp_url.Add(new RTSPURLInfo((i + 1).ToString(), rtsp_url[i]));
            }
        }

        /// <summary>
        /// 播放
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            ctsShow = new CancellationTokenSource();

            for (int i = 0; i < 6; i++)
            {
                taskCTS[i] = new CancellationTokenSource();
                matQueue[i] = new ConcurrentQueue<Mat>();
            }

            play_rtsp_url.Clear();
            for (int i = 0; i < 6; i++)
            {
                play_rtsp_url.Add(new RTSPURLInfo((i + 1).ToString(), rtsp_url[i]));
            }

            for (int i = 0; i < play_rtsp_url.Count; i++)
            {
                Task.Run(() => DecodeRTSP(play_rtsp_url[i].index, matQueue[i], play_rtsp_url[i].url, taskCTS[i].Token));
                System.Threading.Thread.Sleep(100);
            }

            //显示线程
            Task.Run(() =>
            {
                Mat mat = new Mat();
                string winName = "video";

                Cv2.NamedWindow(winName, WindowFlags.Normal);
                Cv2.ResizeWindow(winName, fullSize);

                int delay = (int)(1000 / fps);
                Stopwatch stopwatch = new Stopwatch();

                while (true)
                {
                    stopwatch.Restart();
                    delay = (int)(1000 / fps);
                    if (ctsShow.IsCancellationRequested) break;

                    Mat frame = CombiningImages();

                    Cv2.ImShow(winName, frame);

                    delay = (int)(delay - stopwatch.ElapsedMilliseconds);
                    if (delay <= 0)
                    {
                        delay = 1;
                    }
                    Console.WriteLine("delay:" + delay.ToString());
                    Cv2.WaitKey(delay);

                    frame.Dispose();
                }
                Cv2.DestroyAllWindows();
            });
        }

        OpenCvSharp.Size fullSize = new OpenCvSharp.Size(1008, 570);
        OpenCvSharp.Size mainSize = new OpenCvSharp.Size(672, 380);
        OpenCvSharp.Size subSize = new OpenCvSharp.Size(336, 190);

        Mat CombiningImages()
        {
            Console.WriteLine(string.Format("matQueue0:{0},matQueue1:{1},matQueue2:{2},matQueue3:{3},matQueue4:{4},matQueue5:{5}"
                , matQueue[0].Count
                , matQueue[1].Count
                , matQueue[2].Count
                , matQueue[3].Count
                , matQueue[4].Count
                , matQueue[5].Count
                ));

            Mat mat = Mat.Zeros(fullSize, MatType.CV_8UC3);

            Mat mat0 = new Mat();
            matQueue[0].TryDequeue(out mat0);
            if (mat0 == null || mat0.Empty())
            {
                mat0 = Mat.Zeros(mainSize, MatType.CV_8UC3);
            }
            Cv2.Resize(mat0, mat0, mainSize);

            Mat mat1 = new Mat();
            matQueue[1].TryDequeue(out mat1);
            if (mat1 == null || mat1.Empty())
            {
                mat1 = Mat.Zeros(subSize, MatType.CV_8UC3);
            }
            Cv2.Resize(mat1, mat1, subSize);

            Mat mat2 = new Mat();
            matQueue[2].TryDequeue(out mat2);
            if (mat2 == null || mat2.Empty())
            {
                mat2 = Mat.Zeros(subSize, MatType.CV_8UC3);
            }
            Cv2.Resize(mat2, mat2, subSize);

            Mat mat3 = new Mat();
            matQueue[3].TryDequeue(out mat3);
            if (mat3 == null || mat3.Empty())
            {
                mat3 = Mat.Zeros(subSize, MatType.CV_8UC3);
            }
            Cv2.Resize(mat3, mat3, subSize);

            Mat mat4 = new Mat();
            matQueue[4].TryDequeue(out mat4);
            if (mat4 == null || mat4.Empty())
            {
                mat4 = Mat.Zeros(subSize, MatType.CV_8UC3);
            }
            Cv2.Resize(mat4, mat4, subSize);

            Mat mat5 = new Mat();
            matQueue[5].TryDequeue(out mat5);
            if (mat5 == null || mat5.Empty())
            {
                mat5 = Mat.Zeros(subSize, MatType.CV_8UC3);
            }
            Cv2.Resize(mat5, mat5, subSize);

            //第一张主图
            Rect roi0 = new Rect(0, 0, 672, 380);
            Mat position0 = new Mat(mat, roi0);
            mat0.CopyTo(position0);

            //第二张图
            Rect roi1 = new Rect(672, 0, 336, 190);
            Mat position1 = new Mat(mat, roi1);
            mat1.CopyTo(position1);

            //第三张图
            Rect roi2 = new Rect(672, 190, 336, 190);
            Mat position2 = new Mat(mat, roi2);
            mat2.CopyTo(position2);

            //第4张图
            Rect roi3 = new Rect(672, 380, 336, 190);
            Mat position3 = new Mat(mat, roi3);
            mat3.CopyTo(position3);

            //第5张图
            Rect roi4 = new Rect(336, 380, 336, 190);
            Mat position4 = new Mat(mat, roi4);
            mat4.CopyTo(position4);

            //第6张图
            Rect roi5 = new Rect(0, 380, 336, 190);
            Mat position5 = new Mat(mat, roi5);
            mat5.CopyTo(position5);

            mat0.Dispose();
            mat1.Dispose();
            mat2.Dispose();
            mat3.Dispose();
            mat4.Dispose();
            mat5.Dispose();

            position0.Dispose();
            position1.Dispose();
            position2.Dispose();
            position3.Dispose();
            position4.Dispose();
            position5.Dispose();

            return mat;

        }

        void DecodeRTSP(string index, ConcurrentQueue<Mat> matQueue, string url, CancellationToken cancellationToken = default)
        {
            VideoCapture vcapture = new VideoCapture(url);
            if (!vcapture.IsOpened())
            {
                Console.WriteLine("打开视频文件失败");
                return;
            }

            // 计算等待时间(毫秒)
            int taskDelay = (int)(1000 / fps);
            Stopwatch stopwatch = new Stopwatch();


            while (true)
            {
                if (cancellationToken.IsCancellationRequested) break;

                stopwatch.Restart();
                Mat frame = new Mat();
                if (!vcapture.Read(frame))
                {
                    Console.WriteLine("读取失败");
                    break;
                }

                taskDelay = (int)(1000 / fps);

                //中间标注数字,模拟路数
                Cv2.PutText(frame, index.ToString(), new OpenCvSharp.Point(frame.Width / 2, frame.Height / 2), HersheyFonts.HersheySimplex, 20, Scalar.Red, 20);

                matQueue.Enqueue(frame);

                taskDelay = (int)(taskDelay - stopwatch.ElapsedMilliseconds);
                if (matQueue.Count > 100)
                {
                    Console.WriteLine("index:" + index + ",后续处理能力不足……");
                }

                if (matQueue.Count < 10)
                {
                    taskDelay = taskDelay - 5;
                }

                if (taskDelay <= 0)
                {
                    taskDelay = 0;
                }
                Console.WriteLine("index:" + index + ",taskDelay:" + taskDelay);
                Task.Delay(taskDelay).Wait();

            }

            vcapture.Release();

        }

        /// <summary>
        /// 取消第一路
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button4_Click(object sender, EventArgs e)
        {
            taskCTS[0].Cancel();
        }

        /// <summary>
        /// 记载第7路
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button3_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < 6; i++)
            {
                taskCTS[i].Cancel();
            }

            for (int i = 0; i < 6; i++)
            {
                taskCTS[i] = new CancellationTokenSource();
            }

            //删除最后一个元素
            play_rtsp_url.RemoveAt(play_rtsp_url.Count - 1);

            //把第7路的地址 放到第一的位置
            play_rtsp_url.Insert(0, new RTSPURLInfo("7", rtsp_url[6]));

            for (int i = 0; i < play_rtsp_url.Count; i++)
            {
                Task.Run(() => DecodeRTSP(play_rtsp_url[i].index, matQueue[i], play_rtsp_url[i].url, taskCTS[i].Token));
                System.Threading.Thread.Sleep(10);
            }
        }

        /// <summary>
        /// 加载第8路
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button5_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < 6; i++)
            {
                taskCTS[i].Cancel();
            }

            for (int i = 0; i < 6; i++)
            {
                taskCTS[i] = new CancellationTokenSource();
            }

            //删除最后一个元素
            play_rtsp_url.RemoveAt(play_rtsp_url.Count - 1);

            //把第8路的地址 放到第一的位置
            play_rtsp_url.Insert(0, new RTSPURLInfo("8", rtsp_url[7]));

            for (int i = 0; i < play_rtsp_url.Count; i++)
            {
                Task.Run(() => DecodeRTSP(play_rtsp_url[i].index, matQueue[i], play_rtsp_url[i].url, taskCTS[i].Token));
                System.Threading.Thread.Sleep(10);
            }


        }
    }

    public class RTSPURLInfo
    {
        public string index;
        public string url;

        public RTSPURLInfo(string index, string url)
        {
            this.index = index;
            this.url = url;
        }
    }

}

下载

源码下载

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

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

相关文章

MS5046T/5047T/5048T/5048N_2kSPS、16bit Σ-Δ ADC

MS5046T/MS5047T/MS5048T/MS5048N 是适合高精 度、低成本测量应用的 16bit 模数转换器。其内部集成低 噪声可编程增益放大器、高精度 Δ-Σ 模数转换器和内部振 荡器。 MS5047T 、 MS5048T 、 MS5048N 内部还集成低温 漂基准和两路匹配的可编程电流源。 MS5048T/MS50…

计算机毕业设计 健身房管理系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

springboot考勤管理系统代码调试讲解论文

2 相关技术 2.1 MySQL数据库 该研究和开发的应用程序在数据操作中难以预料&#xff0c;有时候甚至发生改变。没办法直接从Word中写数据和信息&#xff0c;这不但不安全的&#xff0c;并且难以实现应用程序的功效。要实现所需要的文档存储作用&#xff0c;请尽快选择专业数据存…

【JPCS独立出版,EI稳定检索】2024年工业机器人与先进制造技术国际学术会议(IRAMT 2024,9月27-29)

2024年工业机器人与先进制造技术国际学术会议&#xff08;IRAMT 2024&#xff09;将于2024年9月27-29日在中国成都举办。 此次会议将围绕工业机器人、机电技术、机械及制造等领域的最新研究成果展开讨论&#xff0c;并广泛邀请了国内外领域内的著名专家与学者。会议旨在搭建一个…

Vision Transformer学习笔记

论文链接&#xff1a;https://arxiv.org/abs/2010.11929 项目链接&#xff1a;https://github.com/google-research/vision_transformer 本文代码链接&#xff1a;https://gitcode.com/gh_mirrors/de/deep-learning-for-image-processing/tree/master/pytorch_classification/v…

MS2350M/MS2350D——RF 检测器/控制器

MS2350M/MS2350D 是一款对数放大器芯片&#xff0c;相比 MS2351M/MS2351D &#xff0c;它的应用频率范围的下限可低至 4MHz 。主要用于接收信号强度指示 (RSSI) 与功率放大器 控制&#xff0c;工作频率范围是 4MHz  3000MHz &#xff0c;动态范围约 40dB 。 MS2350M/M…

【Qt】QWidget的windowIcon属性

QWidget的windowIcon属性 windowIcon表示窗口的图标 当我们使用默认的windowIcon的时候&#xff0c;其窗口的图标如下&#xff1a; API说明 windowIcon() 获取到控件的窗⼝图标. 返回 QIcon 对象. setWindowIcon(const QIcon& icon) 设置控件的窗⼝图标. 在Qt中&…

CTFHUB-SQL注入-过滤空格

目录 查询数据库名 查询数据库中的表 查询表中字段 查询表中数据 空格被过滤&#xff0c;使用 /**/ 绕过 查询数据库名 -1/**/union/**/select/**/1,database() 查询数据库中的表 -1/**/union/**/select/**/1,group_concat(table_name)/**/from/**/information_schema.t…

多分类实战:一文掌握 One-vs-All 策略

引言 在机器学习领域&#xff0c;分类问题是常见的任务之一。当我们面对的问题不仅限于两类分类&#xff08;如正例和反例&#xff09;&#xff0c;而是需要处理多个类别时&#xff0c;就会遇到多类分类问题。例如&#xff0c;在手写数字识别中&#xff0c;我们需要将输入图像…

Linux 之 shell指令个人解析

1.echo 类似printf 都是在屏幕上显示字符 2.$ 可以在引用变量时使用 3.read 可以读取你输入的字符&#xff0c;有八个属性 -p可以让读取的东西赋值为变量 4.加减乘除等算法的应用 要用到$(( 算式 )) 注&#xff1a;total等于号不能空开&#xff0c;一空开就错误 5.te…

Java读写EM4305卡、将4305卡制做成4100ID卡

EM4305/EM4205卡是采用瑞士EM微电子公司工作频率为125kHz&#xff0c;具有读、写功能的非接触式RFID射频芯片&#xff0c;它具有功耗低、可提供多种数据传输速率和数据编码方法等特点&#xff0c;适合射频芯片ISO 11784/11785规范&#xff0c;该芯片被广泛应用于动物识别和跟踪…

传智教育引通义灵码进课堂,为技术人才教育学习提效

7 月 17 日&#xff0c;阿里云与传智教育在阿里巴巴云谷园区签署合作协议&#xff0c;双方将基于阿里云智能编程助手通义灵码在课程共建、品牌合作及产教融合等多个领域展开合作&#xff0c;共同推进 AI 教育及相关业务的发展&#xff0c;致力于培养适应未来社会需求的高素质技…

PyTorch之loading fbgemm.dll异常的解决办法

前言 PyTorch是一个深度学习框架&#xff0c;当我们在本地调试大模型时&#xff0c;可能会选用并安装它&#xff0c;目前已更新至2.4版本。 一、安装必备 1. window 学习或开发阶段&#xff0c;我们通常在window环境下进行&#xff0c;因此需满足以下条件&#xff1a; Windo…

tkinter绘制组件(43)——对话框

tkinter绘制组件&#xff08;43&#xff09;——对话框 引言布局窗口初始化对话框类型弹窗显示和窗口冻结内容返回信息提示输入对话框 函数封装 效果测试代码最终效果 github项目pip下载结语 引言 严格来说&#xff0c;对话框是控件的组合&#xff0c;不是一个控件&#xff0c…

AI菜鸟向前飞 — OpenAI Assistant API 原理以及核心结构(二)

AI菜鸟向前飞 — OpenAI Assistant API 原理以及核心结构&#xff08;一&#xff09; 使用Assistant API 如何去实现一个自定义“Tool” 依然是三步走&#xff0c;是不是很像&#xff1f;与LangChain定义的方式基本一致&#xff0c;请回看 AI菜鸟向前飞 — LangChain系列之十三…

详细分析SQL Server触发器的基本知识

目录 前言1. 基本知识2. Demo3. 查找特定表的存储过程 前言 原先写过一篇类似的&#xff0c;不过是基于Mysql&#xff1a;添加链接描述 对应Sql Server的补充知识点&#xff1a;详细配置SQL Server的链接服务器&#xff08;图文操作Mysql数据库&#xff09; 1. 基本知识 基…

JVM虚拟机(一)介绍、JVM内存模型、JAVA内存模型,堆区、虚拟机栈、本地方法栈、方法区、常量池

目录 学习JVM有什么用、为什么要学JVM&#xff1f; JVM是什么呢&#xff1f; 优点一&#xff1a;一次编写&#xff0c;到处运行。&#xff08;Write Once, Run Anywhere&#xff0c;WORA&#xff09; 优点二&#xff1a;自动内存管理&#xff0c;垃圾回收机制。 优点三&am…

IOS 03 纯代码封装自定义View控件

本节将通过纯代码进行封装自定义View控件&#xff0c;以常用的设置页的item为例&#xff0c;实现UI效果如下&#xff1a; 1、创建SettingView继承自UIView import UIKitclass SettingView: UIView {} 2、重写 init() 和 required init?(coder: NSCoder) 方法 纯代码创建Set…

仿RabbitMq实现消息队列正式篇(虚拟机篇)

TOC目录 虚拟机模块 要管理的数据 要管理的操作 消息管理模块 要管理的数据 消息信息 消息主体 消息的管理 管理方法 管理数据 管理操作 队列消息管理 交换机数据管理 要管理的数据 要管理的操作 代码展示 队列数据管理 要管理的数据 要管理的操作 代码展示…

PHP转Go系列 | ThinkPHP与Gin框架之打造基于WebSocket技术的消息推送中心

大家好&#xff0c;我是码农先森。 在早些年前客户端想要实时获取到最新消息&#xff0c;都是使用定时长轮询的方式&#xff0c;不断的从服务器上获取数据&#xff0c;这种粗暴的骚操作实属不雅。不过现如今我也还见有人还在一些场景下使用&#xff0c;比如在 PC 端扫描二维码…