【官方框架地址】
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