C# Emgu.CV4.8.0读取rtsp流分段保存

【官方框架地址】

https://github.com/emgucv/emgucv

【算法介绍】

EMGU CV(Emgu Computer Vision)是一个开源的、基于.NET框架的计算机视觉库,它提供了对OpenCV(开源计算机视觉库)的封装。EMGU CV使得在.NET应用程序中实现计算机视觉功能变得更加容易,同时也支持C#和VB.NET等编程语言。

以下是对EMGU的详细介绍:

一、背景和历史

EMGU CV源于欧洲的一个研究项目,旨在为图像处理和计算机视觉应用提供一种易于使用的.NET接口。该项目最初是在德国慕尼黑工业大学开发的,后来被移至奥地利因斯布鲁克大学继续进行。自2008年以来,EMGU CV成为开源项目,并吸引了全球的开发者和研究人员的关注。

二、特点

跨平台性:EMGU CV可以在多种操作系统上运行,包括Windows、Linux和Mac OS X。这意味着开发人员可以编写一次代码,并在多个平台上运行。

.NET集成:由于EMGU是基于.NET框架的,因此它可以轻松地与现有的.NET应用程序集成。开发人员可以利用现有的.NET库和工具,如Visual Studio和NuGet包管理器,来加速开发过程。

OpenCV封装:EMGU CV封装了OpenCV库的功能,这意味着开发人员可以利用OpenCV的强大功能来实现各种图像处理和计算机视觉任务。

易用性:与原始的C++ OpenCV相比,EMGU CV提供了更易于使用的.NET接口。它提供了丰富的类和方法,简化了计算机视觉应用的开发过程。

社区支持:由于EMGU CV是开源的,因此有一个活跃的开发者社区提供支持和帮助。这意味着当遇到问题时,可以找到大量的在线资源和论坛来获取帮助。

不断更新和改进:随着计算机视觉技术的发展,EMGU CV也在不断更新和改进。通过定期发布新版本,库的功能得以增强,并支持最新的算法和技术。

与其他库的集成:除了对OpenCV的支持外,EMGU CV还可以与其他的图像处理和计算机视觉库集成,如OpenKinect、ARToolKitPlus等。这使得开发人员可以轻松地扩展其应用程序的功能。

三、应用领域

由于其强大的功能和易用性,EMGU CV被广泛应用于各种计算机视觉应用领域,包括但不限于:

人脸识别:利用EMGU CV实现人脸检测和识别,可用于安全、门禁系统等领域。

机器视觉:在生产线上的产品检测、定位和识别等任务中发挥关键作用。

图像处理:进行图像滤波、色彩转换、特征提取等操作。

运动跟踪:实时跟踪视频中的对象,如运动物体的跟踪和轨迹分析。

医学影像分析:在医学领域中处理和分析医学影像数据,如X光片、MRI图像等。

无人机和机器人视觉:为无人机和机器人提供视觉感知能力,使其能够自主导航和避障。

虚拟现实和增强现实:在虚拟现实和增强现实应用中实现场景理解和物体识别等功能。

实时视频流处理:在实时视频流中检测异常事件或进行实时分析。

四、结论

EMGU CV是一个强大而灵活的计算机视觉库,它为开发人员提供了一个易于使用的.NET接口来开发各种计算机视觉应用。由于其跨平台性、对OpenCV的封装以及活跃的社区支持,EMGU CV成为许多开发人员的首选工具之一。通过利用EMGU CV的功能,可以加速计算机视觉应用的开发过程并实现各种创新的应用场景。

【效果展示】

【实现部分代码】

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Emgu.CV;
using FIRC;
 
namespace RtspDemo
{
    public partial class Form1 : Form
    {
        RtspManager rm = new RtspManager();
        bool startRecordVideo = false;
        int totalSaveFrameCount = 0;
        VideoManager vm = null;
        int startIndex = 0;
 
        public Form1()
        {
            InitializeComponent();
            CheckForIllegalCrossThreadCalls = false;
        }
 
        private void btn_connect_Click(object sender, EventArgs e)
        {
            if(btn_connect.Text=="连接")
            {
                if (string.IsNullOrEmpty(tb_rtsp.Text))
                {
                    tssl_show.Text = "rtsp流地址错误!";
                    return;
                }
                rm.Connect(tb_rtsp.Text);
                if (rm.Connected)
                {
                    tssl_show.Text = "连接成功";
                    btn_connect.Text = "停止";
                    rm.Start();
                }
                else
                {
                    tssl_show.Text = "连接失败";
                }
 
            }
            else
            {
                rm.Stop();
                rm.DisConnect();
                btn_connect.Text = "连接";
                tssl_show.Text = "连接中断!";
            }
           
 
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            
            rm.GetImage += Rm_GetImage;
            rm.GetStatus += Rm_GetStatus;
        }
 
        private void Rm_GetStatus(string msg)
        {
            if(msg=="disconnect")
            {
                btn_connect.Text = "连接";
                btn_video.Text = "开始录像";
                vm.Dispose();
            }
        }
 
        private void Rm_GetImage(Mat frame)
        {
            if(startRecordVideo)
            {
                startIndex++;
                if(startIndex>=totalSaveFrameCount)
                {
                    startIndex = 0;
                    var saveFile = GetTimeString() + ".mp4";
                    vm = new VideoManager(saveFile, rm.Fps, rm.Width, rm.Height);
                }
                vm.WriteFrame(frame);
            }
            pictureBox1.Image = frame.ToBitmap();
        }
 
        public string GetTimeString()
        {
            return DateTime.Now.ToString("yyyyMMdd-HHmmss_fff");
        }
        private void btn_pic_Click(object sender, EventArgs e)
        {
            if(pictureBox1.Image!=null)
            {
                var saveFile = GetTimeString() + ".jpg";
                pictureBox1.Image.Save(saveFile,ImageFormat.Jpeg);
                tssl_show.Text = "抓拍成功,保存为" + saveFile;
            }
        }
 
        private void btn_video_Click(object sender, EventArgs e)
        {
            if(btn_video.Text=="开始录像")
            {
                if(btn_connect.Text=="连接")
                {
                    tssl_show.Text = "请先连接RTSP流!";
                    return;
                }
                btn_video.Text = "停止录像";
                btn_video.Update();
                Task.Run(() => {
                totalSaveFrameCount = Convert.ToInt32(tb_interval.Text) * rm.Fps;
                startIndex = 0;
                var saveFile = GetTimeString() + ".mp4";
                vm = new VideoManager(saveFile,rm.Fps,rm.Width,rm.Height);
                startRecordVideo = true;
               
                });
 
            }
            else
            {
                vm.Dispose();
                startRecordVideo = false;
                btn_video.Text ="开始录像";
            }
        }
    }
}

【视频演示】

https://www.bilibili.com/video/BV17N4y1q7cW/?vd_source=989ae2b903ea1b5acebbe2c4c4a635ee

【源码下载】

【测试环境】

测试环境:

vs2019

netframework4.7.2

Emgu4.8.0

相关推荐
yufei-coder6 分钟前
C#基础语法
开发语言·c#·.net
长天一色6 分钟前
【ECMAScript 从入门到进阶教程】第三部分:高级主题(高级函数与范式,元编程,正则表达式,性能优化)
服务器·开发语言·前端·javascript·性能优化·ecmascript
yngsqq11 分钟前
031集——文本文件按空格分行——C#学习笔记
笔记·学习·c#
_.Switch17 分钟前
Python机器学习模型的部署与维护:版本管理、监控与更新策略
开发语言·人工智能·python·算法·机器学习
醉颜凉20 分钟前
银河麒麟桌面操作系统修改默认Shell为Bash
运维·服务器·开发语言·bash·kylin·国产化·银河麒麟操作系统
NiNg_1_23426 分钟前
Vue3 Pinia持久化存储
开发语言·javascript·ecmascript
带带老表学爬虫34 分钟前
java数据类型转换和注释
java·开发语言
qianbo_insist37 分钟前
simple c++ 无锁队列
开发语言·c++
BigYe程普1 小时前
我开发了一个出海全栈SaaS工具,还写了一套全栈开发教程
开发语言·前端·chrome·chatgpt·reactjs·个人开发
彭于晏6891 小时前
Android广播
android·java·开发语言