一.AForge和EmguCV
1.Aforge
Aforge
2.EmguCV
OpenCV(Open Source Computer Vision Library)是一個(開源免費)發行的跨平台計算機視覺庫,可以運行在Linux、Windows、Android、ios等操作系統上,它輕量級而且高效—由一系列C函數和少量C++類構成,同時提供了Python、Ruby、MATLAB等語言的接口,實現了圖像處理和計算機視覺方面的諸多通用算法。
EmguCV是OpenCV的一個跨平台的.Net封裝,由於OpenCV是用C和C++編寫的,Emgu用C#對其進行封裝,允許用.Net語言來調用OpenCV函數,如C#、VB、VC++等,同時該封裝也可以被編譯到Mono平台和允許在Windows、Mac OS、Android、iPhone、iPad等多個平台上運行。
OpenCV官網:https://opencv.org/
EmguCV官網:http://www.emgu.com/wiki/index.php/Main_Page
二.AForge獲取本地攝像頭
三.EmguCV獲取本地攝像頭/ 播放RTSP地址視頻流
1.安裝EmguCV
NuGet安裝EmguCV:項目引用上右鍵點擊,選擇“管理NuGet程序包”。
搜索EmguCV,點擊紅框的進行安裝下載。
安裝好后,引用有以下3個關鍵包:
Emgu.CV.UI:
包含UI組件,用於forms和WPF窗口組件。其中的ImageBox是顯示視頻流的關鍵UI。
Emgu.CV.UI.GL:
Emgu.CV.World:
2.WPF實現顯示視頻流代碼
1.建立如下的WPF窗口。
xmal代碼如下:
<Window x:Class="RTSP測試.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:RTSP測試"
xmlns:ui="clr-namespace:Emgu.CV.UI;assembly=Emgu.CV.UI"
xmlns:wfi ="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<wfi:WindowsFormsHost Grid.Column="0" Grid.Row="0">
<ui:ImageBox x:Name="img"/>
</wfi:WindowsFormsHost>
<Button x:Name="Open" FontSize="40" Grid.Row="1" Grid.Column="0" Content="打開" Click="Open_Click"/>
<Button x:Name="Start" FontSize="40" Grid.Row="1" Grid.Column="1" Content="開始" Click="Start_Click"/>
<Button x:Name="RTSP" FontSize="40" Grid.Row="0" Grid.Column="1" Content="RTSP" Click="RTSP_Click"/>
</Grid>
</Window>
注意:
這里要引用兩個命令空間:
xmlns:wfi ="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration"
這個空間時包含WindowsFormsHost組件,用於放置一些圖片,視頻播放器的UI控件(我只會這么用)。
xmlns:ui="clr-namespace:Emgu.CV.UI;assembly=Emgu.CV.UI"
這個空間是ImageBox組件的空間。IamgeBox是EmguCV的播放視頻組件。
后台代碼:
using Emgu.CV;
using Emgu.CV.Structure;
using System;
using System.Windows;
using System.Windows.Media.Imaging;
using System.Drawing;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Navigation;
using System.Runtime.InteropServices;
namespace RTSP測試
{
/// <summary>
/// MainWindow.xaml 的交互邏輯
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
#region CV相關
//emguCV捕捉視頻信息的類
Capture capture;
//RTSP視頻流地址
string RTSPStream = "rtsp地址";
private Bgr f = new Bgr(System.Drawing.Color.Red);
//================初始化capture,用於打開按鈕調用=======================
public void InitCamera()
{
//將capture實例化,沒有任何參數的實例化將會讀取本地攝像頭
capture = new Capture();
//捕捉圖片時調用的事件
capture.ImageGrabbed += Capture_ImageGrabbed;
}
/// <summary>
/// 捕獲圖像的事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Capture_ImageGrabbed(object sender, System.EventArgs e)
{
Mat frame = new Mat();
capture.Retrieve(frame, 0);
img.Image = frame;
}
#endregion
#region 控件事件
private void Open_Click(object sender, RoutedEventArgs e)
{
InitCamera();
}
private void Start_Click(object sender, RoutedEventArgs e)
{
if (capture != null)
{
if ((string)Start.Content == "停止")
{
//stop the capture
Start.Content = "開始";
capture.Pause();
}
else
{
//start the capture
Start.Content = "停止";
capture.Start();
}
}
}
private void RTSP_Click(object sender, RoutedEventArgs e)
{
try
{
//通過地址獲取捕捉文件
capture = new Capture(RTSPStream);
//捕捉
capture.ImageGrabbed += Capture_ImageGrabbed;
}
catch
{
}
}
#endregion
}
}
3.運行結果
點擊“打開”,啟動本地攝像頭;
在點擊“開始”,開始捕捉畫面。成功。
如下:
設置好rtsp地址。
點擊“RTSP”,在點擊“開始”。
成功如下:
4.對視頻標記(用於各類檢測)
如圖:標記拳頭
代碼:將Mat文件標記並轉為IImage類對象用於顯示
//=================將Mat類對象標記並轉為IImage對象用於ImageBox顯示==============
private IImage Mark(Mat mat)
{
//判斷空,否則有個莫名的錯誤
if (mat==null || mat.Bitmap == null)
{
return null;
}
//將Mat類對象 轉化 為可畫的類型
Image<Bgr, byte> image = new Image<Bgr, byte>(mat.Bitmap);
//保存檢測框的信息
System.Drawing.Rectangle rectangle = new System.Drawing.Rectangle
{
//===========此區域進行你的檢測框標記===========
X = 100,
Y = 100,
Width = 50,
Height = 50
//===========此區域進行標記=====================
};
//IImage文件畫上標記
image.Draw(rectangle, f);
return image;
}```
將圖片抓取的代碼修改一下,換個函數名字
```c
private void Capture_Mark(object sender, System.EventArgs e)
{
Mat frame = new Mat();
capture.Retrieve(frame, 0);
//處理並且顯示圖片
img.Image = Mark(frame);
}
加入事件中
public void InitCamera()
{
//將capture實例化,沒有任何參數的實例化將會讀取本地攝像頭
capture = new Capture();
//捕捉圖片時調用的事件
capture.ImageGrabbed += Capture_Mark;
}
給“打開”按鈕調用
private void Open_Click(object sender, RoutedEventArgs e)
{
InitCamera();
}
————————————————
版權聲明:本文為CSDN博主「彌敦道九號技師」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_45487715/article/details/107915992