lunedì 5 febbraio 2018

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

Si riporta l'articolo scritto per il sito https://www.iprogrammatori.it/articoli/programmazione/art_net-creazione-di-un-sistema-di-videosorv_1547.aspx

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 le 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

 

 

        '''

        ''' costruttore

        '''

        ''' source">

        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;

 

namespace WinTest

{

   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;

 

 

        ///

        /// costruttore

        ///

        /// source">

        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

Nessun commento: