Creazione di un sistema di videosorveglianza in 4.6 VB.Net e C#

Prima parte di un tutorial sulla realizzazione di un software di video sorveglianza con la tecnologia .Net 4.6 e linguaggio di programmazione VB.Net e C#.

il
Sviluppatore Microsoft .Net, Collaboratore di IProgrammatori

Introduzione

In questo articolo vedremo come realizzare una semplice applicazioni di tipo Windows Application, in .Net 4.6 utilizzando Visual Studio 2017 Community per la creazione di un sistema di videosorveglianza.
L’applicativo visualizzerà costantemente il video in cui la telecamera è puntata.
Come linguaggio si utilizzerà quelli più diffusi Visual Basic Net e C#.
Per realizzare tale sistema faremo uso della libreria gratuita Aforge.Net Framework, scaricabile qui http://www.aforgenet.com/framework/ che permette anche l’uso di alcuni effetti sulle immagini.
Nella pagina di download, qui http://www.aforgenet.com/framework/downloads.html è possibile scaricare solo le librerie, oppure il pacchetto di installazione o quello completo.
Nel nostro caso abbiamo scaricato solo le librerie compilata.

Creazione del progetto

Si crea un nuovo progetto di tipo “Windows Application”, una volta selezionato il linguaggio di proprio interesse, selezionare la voce “Desktop Classico di Windows” e poi nei vari modelli, selezionare “App Windows Forms (.Net Framework)”.
Dopo aver selezionato il progetto, diamo un nome al nostro progetto.
A questo punto verrà visualizzata la form.
Nella nostra finestra, inseriamo il controllo, picturebox, un controllo di tipo button (pulsante) ed una combobox.
Rendiamo la picture abbastanza grande, che sarà utilizzata per visualizzare il video.


Stesura del codice

Ora non ci resta che aggiungere i riferimenti alla libreria che abbiamo scaricato in precedenza, in particolare per i seguenti file:
AForge, AForge.Imaging, AForge.Video, AForge.Video.DirectShow, AForge.Video.VFW, AForge.Vision .
Queste classi ci permetteranno di gestire Ie dispositive, ed il flusso.
Terminata l’aggiunta dei file, dobbiamo creare una classe che avrà l’obiettivo di gestire nella form tale periferica e darci informazioni.
Si crea una nuova classe denominata “Videocamera” .
Nella classe aggiungiamo lo spazio dei nomi delle librerie aggiunte in precedenza, si riporta qui di seguito il frammento di codice.

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 nella classe si crea una proprietà che permetterà di ottenere informazioni utili sul flusso della videocamera, la proprietà sarà di tipo “VideoCaptureDevice”.


Qui di seguito tale dichiarazione.

VB.Net
Private mvideoCapturePeriferica As VideoCaptureDevice
Public ReadOnly Property VideoCapturePeriferica As VideoCaptureDevice
Get
Return mvideoCapturePeriferica
End Get
End Property
C#
//Gestione della periferica videocamera
private VideoCaptureDevice videoCapturePeriferica;
public VideoCaptureDevice VideoCapturePeriferica { get => videoCapturePeriferica; }

Si crea una variabile private da gestire all’interno della classe per la gestione della scena o meglio per rilevare i movimenti.

VB.Net
Private determinaMovimento As MotionDetector
C#
//Gestione della scena
MotionDetector determinaMovimento;

Si crea una proprietà, che avrà l’obiettivo di stabile il livello di far scattare l’avviso nel caso si avverte un movimento. Questo livello riguarda la sensibilità da uno spostamento minimo ad uno massimo.
Qui di seguito la dichiarazione di tale proprietà.

VB.Net
Private mlivelloSegnalazione As Double = 0.005
Public Property LivelloSegnalazione As Double
Get
Return mlivelloSegnalazione
End Get
Set
mlivelloSegnalazione = Value
End Set
End Property
C#
//Livello per la segnalazione
private double livelloSegnalazione = 0.005;
public double LivelloSegnalazione { get => livelloSegnalazione; set => livelloSegnalazione = value; }

Si crea una variabile che indica se c’è stato un movimento, da utilizzare come dato informativo, semaforo.
Qui di seguito tale dichiarazione.

VB.Net
Private isMovimento As Boolean C#
private bool isMovimento;

La classe avrà due eventi, per gestire l’inizio e la fine del movimento e di conseguenza fornire indicazioni sull’azione da compiere.
Si riporta il frammento di codice di tale dichiarazione.

VB.Net
'Gestori di evento quando si verifica un movimento o termina
Public Event InizioMovimento As EventHandler
Public Event FineMovimento As EventHandler
C#
public event EventHandler InizioMovimento;
public event EventHandler FineMovimento;

Il costruttore della classe, avrà un parametro, che è la gestione della periferica, oltre al settaggio, verrà eseguita la gestione per l’evento dei flussi.
Qui di seguito si riporta il codice del costruttore della classe.

VB.Net
Public Sub New(source As VideoCaptureDevice)
Me.mvideoCapturePeriferica = source
AddHandler VideoCapturePeriferica.NewFrame, AddressOf VideoCapturePeriferica_NewFrame
determinaMovimento = New MotionDetector(New SimpleBackgroundModelingDetector(), New MotionAreaHighlighting())
End Sub C#
public VideoCamera(VideoCaptureDevice source)
{
this.videoCapturePeriferica = source;
videoCapturePeriferica.NewFrame += VideoCapturePeriferica_NewFrame;
determinaMovimento = new MotionDetector(new SimpleBackgroundModelingDetector(), new MotionAreaHighlighting());
}

Siamo giunti al termine della creazione della classe, con la gestione dell’evento dei flussi, e di questa prima parte.
Qui di seguito si riporta il codice di tale evento.

VB.Net
'evento
Private Sub VideoCapturePeriferica_NewFrame(sender As Object, eventArgs As NewFrameEventArgs)
If determinaMovimento.ProcessFrame(eventArgs.Frame) >= livelloSegnalazione AndAlso Not isMovimento Then
' La percentuale di movimento è superiore alla soglia impostata.
isMovimento = True
RaiseEvent InizioMovimento(Me, eventArgs.Empty)
ElseIf determinaMovimento.ProcessFrame(eventArgs.Frame) < livelloSegnalazione AndAlso isMovimento Then
' La percentuale di movimento è tornata sotto la soglia impostata.
isMovimento = False
RaiseEvent FineMovimento(Me, eventArgs.Empty)
End If
End Sub
C#
//evento
private void VideoCapturePeriferica_NewFrame(object sender, NewFrameEventArgs eventArgs)
{
if (determinaMovimento.ProcessFrame(eventArgs.Frame) >= livelloSegnalazione && !isMovimento)
{
isMovimento = true;
InizioMovimento?.Invoke(this, EventArgs.Empty);
}
else if (determinaMovimento.ProcessFrame(eventArgs.Frame) < livelloSegnalazione && isMovimento)
{
isMovimento = false;
FineMovimento?.Invoke(this, EventArgs.Empty);
}
}

Si riporta il codice completo di tale classe per entrambi i linguaggi.

VB.Net
Imports AForge.Video.DirectShow
Imports AForge.Vision.Motion
Imports AForge.Video
Imports AForge.Imaging
Imports System.Collections.Generic
Imports System.Linq
Imports System.Text
Imports System.Threading.Tasks
Public Class VideoCamera
'Gestione della periferica videocamera
Private mvideoCapturePeriferica As VideoCaptureDevice
Public ReadOnly Property VideoCapturePeriferica As VideoCaptureDevice
Get
Return mvideoCapturePeriferica
End Get
End Property
'Gestione della scena
Private determinaMovimento As MotionDetector
'Livello per la segnalazione
Private mlivelloSegnalazione As Double = 0.005
Public Property LivelloSegnalazione As Double
Get
Return mlivelloSegnalazione
End Get
Set
mlivelloSegnalazione = Value
End Set
End Property
'utilizzata quando si verifica il movimento default false
Private isMovimento As Boolean
'Gestori di evento quando si verifica un movimento o termina
Public Event InizioMovimento As EventHandler
Public Event FineMovimento As EventHandler
''' <summary>
''' costruttore
''' </summary>
''' <param name="source"></param>
Public Sub New(source As VideoCaptureDevice)
Me.mvideoCapturePeriferica = source
AddHandler VideoCapturePeriferica.NewFrame, AddressOf VideoCapturePeriferica_NewFrame
determinaMovimento = New MotionDetector(New SimpleBackgroundModelingDetector(), New MotionAreaHighlighting())
End Sub
'evento
Private Sub VideoCapturePeriferica_NewFrame(sender As Object, eventArgs As NewFrameEventArgs)
If determinaMovimento.ProcessFrame(eventArgs.Frame) >= livelloSegnalazione AndAlso Not isMovimento Then
' La percentuale di movimento è superiore alla soglia impostata.
isMovimento = True
RaiseEvent InizioMovimento(Me, eventArgs.Empty)
ElseIf determinaMovimento.ProcessFrame(eventArgs.Frame) < livelloSegnalazione AndAlso isMovimento Then
' La percentuale di movimento è tornata sotto la soglia impostata.
isMovimento = False
RaiseEvent FineMovimento(Me, eventArgs.Empty)
End If
End Sub
End Class
C#
using AForge.Video.DirectShow;
using AForge.Vision.Motion;
using AForge.Video;
using AForge.Imaging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

public class VideoCamera
{
//Gestione della periferica videocamera
private VideoCaptureDevice videoCapturePeriferica;
public VideoCaptureDevice VideoCapturePeriferica { get => videoCapturePeriferica; }
//Gestione della scena
MotionDetector determinaMovimento
//Livello per la segnalazione
private double livelloSegnalazione = 0.005;
public double LivelloSegnalazione { get => livelloSegnalazione; set => livelloSegnalazione = value; }
//utilizzata quando si verifica il movimento default false
private bool isMovimento;
//Gestori di evento quando si verifica un movimento o termina
public event EventHandler InizioMovimento;
public event EventHandler FineMovimento;
/// <summary>
/// costruttore
/// </summary>
/// <param name="source"></param>
public VideoCamera(VideoCaptureDevice source)
{
this.videoCapturePeriferica = source;
videoCapturePeriferica.NewFrame += VideoCapturePeriferica_NewFrame;
determinaMovimento =    new MotionDetector(new SimpleBackgroundModelingDetector(), new MotionAreaHighlighting());
}
//evento
private void VideoCapturePeriferica_NewFrame(object sender, NewFrameEventArgs eventArgs)
{
if (determinaMovimento.ProcessFrame(eventArgs.Frame) >= livelloSegnalazione && !isMovimento)
{
isMovimento = true;
InizioMovimento?.Invoke(this, EventArgs.Empty);
}
else if (determinaMovimento.ProcessFrame(eventArgs.Frame) < livelloSegnalazione && isMovimento)
{
isMovimento = false;
FineMovimento?.Invoke(this, EventArgs.Empty);
}
}
}

Conclusioni

In questa prima parte dell’articolo, abbiamo visto la creazione della classe, che permetterà di gestire le varie fasi della periferica, e di gestire i movimenti.
Si è pensato di suddividerlo in due parti, per dare la possibilità al lettore di comprendere l’utilizzo della libreria che si utilizza ma soprattutto l’architettura realizzata.

Vai alla seconda parte della guida: https://www.iprogrammatori.it/articoli/programmazione/art_creazione-di-un-sistema-di-videosorvegli_1548.aspx