Creazione di un sistema di videosorveglianza in VB.Net e C# - Parte 2

In questa seconda ed ultima parte, vedremo come utilizzare la classe realizzata nella prima parte qui https://www.iprogrammatori.it/articoli/programmazione/art_net-creazione-di-un-sistema-di-videosorv_1547.aspx per la realizzazione di un programma per la videosorveglianza con la tecnologia .Net 4.6.
Apriamo il progetto precedente, e passiamo alla nostra form, con i controlli posizionati come illustrato nel precedente articolo.


Stesura del codice

Passiamo in visualizzazione codice della nostra form, ed aggiungiamo sopra ad ogni dichiarazione, in alto, lo spazio dei nomi per la gestione della libreria “Aforge”.
Qui di seguito si riporta il frammento di codice per entrambi i linguaggi di programmazione:

VB.Net
Imports AForge.Video.DirectShow
Imports AForge.Vision.Motion
Imports AForge.Video
Imports AForge.Imaging
C#
using AForge.Video.DirectShow;
using AForge.Vision.Motion;
using AForge.Video;
using AForge.Imaging;

Ora si creano due variabili di classe per la gestione delle periferiche installate ed un oggetto della classe che abbiamo creato in precedenza per la gestione della videocamera.
Qui di seguito la dichiarazione.

VB.Net
Private periferiche As Dictionary(Of String, String)
Private mVideocamera As VideoCamera
C#
private Dictionary<string, string> periferiche;
private VideoCamera mVideocamera;

Si crea un metodo, che verrà eseguito durante la chiusura del nostro applicativo, per terminare la lettura del video della nostra telecamera.
Utilizzando la classe per la gestione della telecamera creata in precedenza, verrà eseguito un controllo se è in esecuzione, ed in tale caso attivare il metodo stop per terminare la lettura del flusso
Qui di seguito tale dichiarazione:

VB.Net
Private Sub ChiusuraVideoCamera()
If mVideocamera IsNot Nothing Then
mVideocamera.VideoCapturePeriferica.SignalToStop()
If mVideocamera.VideoCapturePeriferica.IsRunning Then
mVideocamera.VideoCapturePeriferica.[Stop]()
End If
mVideocamera = Nothing
End If
End Sub
C#
private void ChiusuraVideoCamera()
{
if (mVideocamera != null)
{
mVideocamera.VideoCapturePeriferica.SignalToStop();
if (mVideocamera.VideoCapturePeriferica.IsRunning)
{
mVideocamera.VideoCapturePeriferica.Stop();
}
mVideocamera = null;
}
}


Nel costruttore della classe, quando si apre la form, andremo a valorizzare la combobox con i nominativi delle telecamere presenti ed installate sul pc.
Qui di seguito tale dichiarazione:

VB.Net
Public Sub New()
InitializeComponent()
Try
'Recupero tutte le videocamere collegate
Dim ListaPeriferica As New FilterInfoCollection(FilterCategory.VideoInputDevice)
If ListaPeriferica.Count < 1 Then
cmbPeriferiche.Items.Add("Nessun dispositivo rilevato")
cmbPeriferiche.Enabled = False
Else
periferiche = New Dictionary(Of String, String)()
For Each ElementoPeriferica As FilterInfo In ListaPeriferica
periferiche.Add(ElementoPeriferica.Name, ElementoPeriferica.MonikerString)
cmbPeriferiche.Items.Add(ElementoPeriferica.Name)
Next
End If
Catch ex As Exception
MessageBox.Show("Errore: " + ex.Message)
End Try
End Sub
C#
public Form1()
{
InitializeComponent();
try
{
//Recupero tutte le videocamere collegate
FilterInfoCollection ListaPeriferica = new FilterInfoCollection(FilterCategory.VideoInputDevice);
if (ListaPeriferica.Count<1)
{
cmbPeriferiche.Items.Add("Nessun dispositivo rilevato");
cmbPeriferiche.Enabled = false;
}
else
{
periferiche = new Dictionary<string, string>();
foreach (FilterInfo ElementoPeriferica in ListaPeriferica)
{
periferiche.Add(ElementoPeriferica.Name, ElementoPeriferica.MonikerString);
cmbPeriferiche.Items.Add(ElementoPeriferica.Name);
}
}
}
catch (Exception ex)
{
MessageBox.Show("Errore: " + ex.Message);
}
}

Nella chiusura della nostra form, dobbiamo eseguire il metodo per la chiusura della gestione del flusso della telecamera, richiamando tale funzione.
Qui di seguito il codice per entrambi i linguaggi.

VB.Net
Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
ChiusuraVideoCamera()
End Sub
C#
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
ChiusuraVideoCamera();
}


Ora si crea la funzione, che passando un oggetto di tipo “VideoCaptureDevice” avrà il compito di gestire gli eventi delle telecamera, come la gestione dei frame, se c’è stato o no il movimento, impostare il livello di sensibilità di quando far scattare l’avviso quando nel raggio della videocamera ci sono movimenti ed eseguire l’avvio della telecamera.
Qui di seguito si riporta la dichiarazione per entrambi i linguaggi.

VB.Net
Private Sub EseguiVideoCamera(Periferica As VideoCaptureDevice)
ChiusuraVideoCamera()
mVideocamera = New VideoCamera(Periferica)
'gestone del riquadro
AddHandler mVideocamera.VideoCapturePeriferica.NewFrame, AddressOf VideoCapturePeriferica_NewFrame
'gestore degli errori
AddHandler mVideocamera.VideoCapturePeriferica.VideoSourceError, AddressOf VideoCapturePeriferica_VideoSourceError
'gestione dei movimenti
AddHandler mVideocamera.InizioMovimento, AddressOf MVideocamera_InizioMovimento
AddHandler mVideocamera.FineMovimento, AddressOf MVideocamera_FineMovimento
mVideocamera.livelloSegnalazione = 0.005 / 100
mVideocamera.VideoCapturePeriferica.Start()
End Sub
C#
private void EseguiVideoCamera(VideoCaptureDevice Periferica)
{
ChiusuraVideoCamera();
mVideocamera = new VideoCamera(Periferica);
//gestone del riquadro
mVideocamera.VideoCapturePeriferica.NewFrame += VideoCapturePeriferica_NewFrame;
//gestore degli errori
mVideocamera.VideoCapturePeriferica.VideoSourceError += VideoCapturePeriferica_VideoSourceError;
//gestione dei movimenti
mVideocamera.InizioMovimento += MVideocamera_InizioMovimento;
mVideocamera.FineMovimento += MVideocamera_FineMovimento;
mVideocamera.LivelloSegnalazione = 0.005 / 100;
mVideocamera.VideoCapturePeriferica.Start();
}


Ora dobbiamo scrivere il codice per i singoli eventi, L’evento Newframe, avrà il compito di visualizzare nel controllo picturebox il video della nostra videocamera.
Mentre l’evento “VideoSourceError” gestirà la possibile eccezione che si può verificare.
Inoltre utilizzare gli eventi che abbiamo creato nella classe, come l’inizio e la fine del movimento.

VB.Net
'gestore dell'evento
Private Sub VideoCapturePeriferica_NewFrame(sender As Object, eventArgs As NewFrameEventArgs)
Using g As Graphics = pctRiquadroVideo.CreateGraphics()
Dim rectRiquadro As Rectangle = pctRiquadroVideo.ClientRectangle
g.DrawImage(eventArgs.Frame, rectRiquadro.X + 1, rectRiquadro.Y + 1, rectRiquadro.Width - 2, rectRiquadro.Height - 2)
End Using
End Sub
'gestore dell'evento
Private Sub VideoCapturePeriferica_VideoSourceError(sender As Object, eventArgs As VideoSourceErrorEventArgs)
MessageBox.Show("Errore: " + eventArgs.Description)
End Sub
'Gestore dell'evento inizio movimento
Private Sub MVideocamera_InizioMovimento(sender As Object, e As EventArgs)
MessageBox.Show("Rilevato movimento")
End Sub
'Gestore dell'evento fine movimento
Private Sub MVideocamera_FineMovimento(sender As Object, e As EventArgs)
MessageBox.Show("Nessun movimento")
End Sub
C#
//gestore dell'evento
private void VideoCapturePeriferica_NewFrame(object sender, NewFrameEventArgs eventArgs)
{
using (Graphics g = pctRiquadroVideo.CreateGraphics())
{
Rectangle rectRiquadro = pctRiquadroVideo.ClientRectangle;
g.DrawImage(eventArgs.Frame, rectRiquadro.X + 1, rectRiquadro.Y + 1, rectRiquadro.Width - 2, rectRiquadro.Height - 2);
}
}
//gestore dell'evento
private void VideoCapturePeriferica_VideoSourceError(object sender, VideoSourceErrorEventArgs eventArgs)
{
MessageBox.Show("Errore: " + eventArgs.Description);
}
//Gestore dell'evento inizio movimento
private void MVideocamera_InizioMovimento(object sender, EventArgs e)
{
MessageBox.Show("Rilevato movimento");
}
//Gestore dell'evento fine movimento
private void MVideocamera_FineMovimento(object sender, EventArgs e)
{
MessageBox.Show("Nessun movimento");
}

Siamo giunti alla conclusione della stesura del codice, non ci resta che scrivere il codice per l’evento click del pulsante, che permetterà di avviare la telecamera e di conseguenza la gestione degli eventi.

VB.Net
Private Sub BtnVideo_Click(sender As Object, e As EventArgs) Handles BtnVideo.Click
Try
Dim Periferica As New VideoCaptureDevice(periferiche(cmbPeriferiche.SelectedItem.ToString()))
EseguiVideoCamera(Periferica)
Catch ex As Exception
MessageBox.Show("Errore: " + ex.Message)
End Try
End Sub
C#
private void BtnVideo_Click(object sender, EventArgs e)
{
try
{
VideoCaptureDevice Periferica = new VideoCaptureDevice(periferiche[cmbPeriferiche.SelectedItem.ToString()]);
EseguiVideoCamera(Periferica);
}
catch (Exception ex)
{
MessageBox.Show("Errore: " + ex.Message);
}
}


Qui di seguito si riporta il codice completo della form

VB.Net
Imports AForge.Video.DirectShow
Imports AForge.Vision.Motion
Imports AForge.Video
Imports AForge.Imaging
Public Class Form1
Private periferiche As Dictionary(Of String, String)
Private mVideocamera As VideoCamera
Public Sub New()
InitializeComponent()
Try
'Recupero tutte le videocamere collegate
Dim ListaPeriferica As New FilterInfoCollection(FilterCategory.VideoInputDevice)
If ListaPeriferica.Count < 1 Then
cmbPeriferiche.Items.Add("Nessun dispositivo rilevato")
cmbPeriferiche.Enabled = False
Else
periferiche = New Dictionary(Of String, String)()
For Each ElementoPeriferica As FilterInfo In ListaPeriferica
periferiche.Add(ElementoPeriferica.Name, ElementoPeriferica.MonikerString)
cmbPeriferiche.Items.Add(ElementoPeriferica.Name)
Next
End If
Catch ex As Exception
MessageBox.Show("Errore: " + ex.Message)
End Try
End Sub
Private Sub ChiusuraVideoCamera()
If mVideocamera IsNot Nothing Then
mVideocamera.VideoCapturePeriferica.SignalToStop()
If mVideocamera.VideoCapturePeriferica.IsRunning Then
mVideocamera.VideoCapturePeriferica.[Stop]()
End If
mVideocamera = Nothing
End If
End Sub
Private Sub EseguiVideoCamera(Periferica As VideoCaptureDevice)
ChiusuraVideoCamera()
mVideocamera = New VideoCamera(Periferica)
'gestone del riquadro
AddHandler mVideocamera.VideoCapturePeriferica.NewFrame, AddressOf VideoCapturePeriferica_NewFrame
'gestore degli errori
AddHandler mVideocamera.VideoCapturePeriferica.VideoSourceError, AddressOf VideoCapturePeriferica_VideoSourceError
'gestione dei movimenti
AddHandler mVideocamera.InizioMovimento, AddressOf MVideocamera_InizioMovimento
AddHandler mVideocamera.FineMovimento, AddressOf MVideocamera_FineMovimento
mVideocamera.livelloSegnalazione = 0.005 / 100
mVideocamera.VideoCapturePeriferica.Start()
End Sub
'gestore dell'evento
Private Sub VideoCapturePeriferica_NewFrame(sender As Object, eventArgs As NewFrameEventArgs)
Using g As Graphics = pctRiquadroVideo.CreateGraphics()
Dim rectRiquadro As Rectangle = pctRiquadroVideo.ClientRectangle
g.DrawImage(eventArgs.Frame, rectRiquadro.X + 1, rectRiquadro.Y + 1, rectRiquadro.Width - 2, rectRiquadro.Height - 2)
End Using
End Sub
'gestore dell'evento
Private Sub VideoCapturePeriferica_VideoSourceError(sender As Object, eventArgs As VideoSourceErrorEventArgs)
MessageBox.Show("Errore: " + eventArgs.Description)
End Sub
'Gestore dell'evento inizio movimento
Private Sub MVideocamera_InizioMovimento(sender As Object, e As EventArgs)
MessageBox.Show("Rilevato movimento")
End Sub
'Gestore dell'evento fine movimento
Private Sub MVideocamera_FineMovimento(sender As Object, e As EventArgs)
MessageBox.Show("Nessun movimento")
End Sub
Private Sub BtnVideo_Click(sender As Object, e As EventArgs) Handles BtnVideo.Click
Try
Dim Periferica As New VideoCaptureDevice(periferiche(cmbPeriferiche.SelectedItem.ToString()))
EseguiVideoCamera(Periferica)
Catch ex As Exception
MessageBox.Show("Errore: " + ex.Message)
End Try
End Sub
Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
ChiusuraVideoCamera()
End Sub
End Class
C#
using AForge.Video.DirectShow;
using AForge.Vision.Motion;
using AForge.Video;
using AForge.Imaging;
public partial class Form1 : Form
{
private Dictionary<string, string> periferiche;
private VideoCamera mVideocamera;
private void ChiusuraVideoCamera()
{
if (mVideocamera != null)
{
mVideocamera.VideoCapturePeriferica.SignalToStop();
if (mVideocamera.VideoCapturePeriferica.IsRunning)
{
mVideocamera.VideoCapturePeriferica.Stop();
}
mVideocamera = null;
}
}
private void EseguiVideoCamera(VideoCaptureDevice Periferica)
{
ChiusuraVideoCamera();
mVideocamera = new VideoCamera(Periferica);
//gestone del riquadro
mVideocamera.VideoCapturePeriferica.NewFrame += VideoCapturePeriferica_NewFrame;
//gestore degli errori
mVideocamera.VideoCapturePeriferica.VideoSourceError += VideoCapturePeriferica_VideoSourceError;
//gestione dei movimenti
mVideocamera.InizioMovimento += MVideocamera_InizioMovimento;
mVideocamera.FineMovimento += MVideocamera_FineMovimento;
mVideocamera.LivelloSegnalazione = 0.005 / 100;
mVideocamera.VideoCapturePeriferica.Start();
}
//gestore dell'evento
private void VideoCapturePeriferica_NewFrame(object sender, NewFrameEventArgs eventArgs)
{
using (Graphics g = pctRiquadroVideo.CreateGraphics())
{
Rectangle rectRiquadro = pctRiquadroVideo.ClientRectangle;
g.DrawImage(eventArgs.Frame, rectRiquadro.X + 1, rectRiquadro.Y + 1, rectRiquadro.Width - 2, rectRiquadro.Height - 2);
}
}
//gestore dell'evento
private void VideoCapturePeriferica_VideoSourceError(object sender, VideoSourceErrorEventArgs eventArgs)
{
MessageBox.Show("Errore: " + eventArgs.Description);
}
//Gestore dell'evento inizio movimento
private void MVideocamera_InizioMovimento(object sender, EventArgs e)
{
MessageBox.Show("Rilevato movimento");
}
//Gestore dell'evento fine movimento
private void MVideocamera_FineMovimento(object sender, EventArgs e)
{
MessageBox.Show("Nessun movimento");
}
public Form1()
{
InitializeComponent();
try
{
//Recupero tutte le videocamere collegate
FilterInfoCollection ListaPeriferica = new FilterInfoCollection(FilterCategory.VideoInputDevice);
if (ListaPeriferica.Count<1)
{
cmbPeriferiche.Items.Add("Nessun dispositivo rilevato");
cmbPeriferiche.Enabled = false;
}
else
{
periferiche = new Dictionary<string, string>();
foreach (FilterInfo ElementoPeriferica in ListaPeriferica)
{
periferiche.Add(ElementoPeriferica.Name, ElementoPeriferica.MonikerString);
cmbPeriferiche.Items.Add(ElementoPeriferica.Name);
}
}
}
catch (Exception ex)
{
MessageBox.Show("Errore: " + ex.Message);
}
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
ChiusuraVideoCamera();
}
private void BtnVideo_Click(object sender, EventArgs e)
{
try
{
VideoCaptureDevice Periferica = new VideoCaptureDevice(periferiche[cmbPeriferiche.SelectedItem.ToString()]);
EseguiVideoCamera(Periferica);
}
catch (Exception ex)
{
MessageBox.Show("Errore: " + ex.Message);
}
}
}

Ora non ci resta che eseguire il nostro applicativo nel quale vedremo che vicino all’immagine è presente anche un alone che indica se c’è stato o no movimento.

Conclusioni


L’articolo ha voluto fornire al lettore la possibilità di realizzare un applicativo per la videosorveglianza, tramite la libreria gratuita AForge.Net Framework con interessanti spunti per creare dei software anche di un certo livello.
Una libreria, che fornisce al programmatore valide opportunità, grazie alle classi e metodi creati per tale contesto.