mercoledì 14 febbraio 2018

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

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

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 o:p="">

                {

                    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 System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows.Forms;

 

using Intesi.PKBox.Client;

 

 

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 o:p="">

                {

                    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_Load(object sender, EventArgs e)

        {

 

        }

 

        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.

Nessun commento: