giovedì 10 ottobre 2013

Silverlight la gestione della webcam C# e VB.Net

Si riporta l'articolo scritto per il sito http://www.iprogrammatori.it/articoli/programmazione/art_silverlight-la-gestione-della-webcam_1290.aspx


Con la versione 4 di Silverlight, sono state inserite nuove classi, che permettono un utilizzo ancora più professionale della tecnologia Silvierlight. Tra le numerose novità troviamo la gestione della webcam e dell’audio.
In questo articolo, si forniscono le basi di utilizzo della webcam.

Creazione del progetto
Si crea un nuovo progetto in Silverlight secondo il linguaggio di programmazione di vostro gradimento.
Dopo aver creato il progetto, inserite nella pagina due controlli combobox, che avranno il compito di visualizzare l’elenco delle webcam installate nel pc e dell’audio.
Inserite un controllo Rectable, e tre controlli di tipo pulsante il tutto come mostrato in figura 1.



Figura 1 – La finestra con i controlli

Ora non ci resta che creare le classi per visualizzare la ripresa della webcam.
Passiamo in visualizzazione codice e dichiariamo a livello di classe, sotto la dichiarazione della classe, gli oggetti CaptureSource e ImageBrusce

Qui di seguito si riporta il frammento di codice per entrambi i linguaggi.



VB.Net
  Dim CaSourceCattura As New CaptureSource()

    Dim imageBrush = New ImageBrush()

C#
CaptureSource CaSourceCattura = new CaptureSource();



        ImageBrush imageBrush = new ImageBrush();

        VideoCaptureDevice webcam = CaptureDeviceConfiguration.GetDefaultVideoCaptureDevice();

        AudioCaptureDevice audio = CaptureDeviceConfiguration.GetDefaultAudioCaptureDevice();



Nell’evento loadContent della pagina, scriviamo il codice per il caricamento delle combo per la visualizzazione dei nomi delle webcam installate e nomi delle periferiche audio installate.
Qui di seguito si riporta il frammento di codice.




VB.Net
Private Sub LayoutRoot_Loaded(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles LayoutRoot.Loaded

         

        CmbMicrofono.ItemsSource = CaptureDeviceConfiguration.GetAvailableAudioCaptureDevices()

        CmbCam.ItemsSource = CaptureDeviceConfiguration.GetAvailableVideoCaptureDevices()

    End Sub

C#
private void LayoutRoot_Loaded(object sender, RoutedEventArgs e)

        {

            CmbMicrofono.ItemsSource = CaptureDeviceConfiguration.GetAvailableAudioCaptureDevices();

            CmbCam.ItemsSource = CaptureDeviceConfiguration.GetAvailableVideoCaptureDevices();

        }





La classe CaptureDeviceConfiguration, tramite il metodo GetAvailableAudioCaptureDevices elenca tutte le periferiche audio e video installate nel pc.
Nell’evento click del pulsante con la dicitura “Avvia” (o uno dei pulsanti sulla form) dobbiamo eseguire il codice per eseguire la ripresa della webcam.
Qui di seguito, si riporta il codice per il linguaggio di programmazione VB.Net e C# che permette di avviare la ripresa della webcam.




VB.Net
Private Sub BtnAvvia_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles BtnAvvia.Click





        Dim webcam = CaptureDeviceConfiguration.GetDefaultVideoCaptureDevice()



        Dim audio = CaptureDeviceConfiguration.GetDefaultAudioCaptureDevice()



        CaSourceCattura.VideoCaptureDevice = webcam

        CaSourceCattura.AudioCaptureDevice = audio



        Dim webcamBrush = New VideoBrush()



        webcamBrush.SetSource(CaSourceCattura)



        RctVisualizzaCam.Fill = webcamBrush

        If CaptureDeviceConfiguration.RequestDeviceAccess AndAlso (CaSourceCattura.VideoCaptureDevice IsNot Nothing) Then



            Try

                CaSourceCattura.Start()

            Catch ex As InvalidOperationException

                ' Errore

                MessageBox.Show("Impossibile accedere alla webCam")

            End Try



        End If







    End Sub

C#
private void BtnAvvia_Click(object sender, RoutedEventArgs e)

        {



            CaSourceCattura.VideoCaptureDevice = webcam;



            CaSourceCattura.AudioCaptureDevice = audio;

            VideoBrush webcamBrush = new VideoBrush();



            webcamBrush.SetSource(CaSourceCattura);

            RctVisualizzaCam.Fill = webcamBrush;

            if (CaptureDeviceConfiguration.RequestDeviceAccess() && CaSourceCattura.VideoCaptureDevice != null)

            {

                try

                {

                    CaSourceCattura.Start();

                }

                catch (InvalidOperationException ex)

                {



                    MessageBox.Show("Impossibile accedere alla webCam");

                }

            }



          }


Come si è visto dal frammento di codice precedente, dopo aver assegnato alla proprietà VideoCaptureDevice ed AudioCaptureDevice, gli oggetti per la gestione webcam e audio, si verifica se è accessibile, a questo punto, tramite il metodo Start si avvia la ripresa, che verrà visualizzata nel controllo rettangolo.

Tramite il metodo “Stop” della classe “CaptureSource”si ferma la ripresa, qui di seguito un frammento di codice dell’evento click del pulsante per fermare la ripresa.



VB.Net
  Private Sub BtnFerma_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles BtnFerma.Click

        If (CaSourceCattura.VideoCaptureDevice IsNot Nothing) Then

            CaSourceCattura.Stop()

        End If



    End Sub

C#
  private void BtnFerma_Click(object sender, RoutedEventArgs e)

        {

            if (CaSourceCattura.VideoCaptureDevice != null)

            {

                CaSourceCattura.Stop();

            }



        }


A questo punto non ci rimane che scrivere il codice, per utilizzare la webcam per rilevare i singoli frame, ossia immagini dalla nostra webcam.
Nell’evento click inseriamo il codice per tale operazione. Mentre i frammenti di codice seguenti, illustrano vari aspetti, come la gestione in caso di errore, quando ha completato il rilevamento delle immagini, e tanto altro.




VB.Net
Private Sub BtnRilevaImmagine_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles BtnRilevaImmagine.Click

        ' Rilevo l'immagine

        RctVisualizzaCam.Fill = imageBrush

        If CaptureDeviceConfiguration.RequestDeviceAccess AndAlso (CaSourceCattura.VideoCaptureDevice IsNot Nothing) Then



            CaSourceCattura.Start()

            If (CaSourceCattura.VideoCaptureDevice IsNot Nothing) _

            AndAlso (CaSourceCattura.State = CaptureState.Started) Then



                CaSourceCattura.CaptureImageAsync()



            End If

        End If

        AddHandler CaSourceCattura.CaptureImageCompleted, AddressOf CaSourceCattura_CaptureImageCompleted



        AddHandler CaSourceCattura.CaptureFailed, AddressOf CaSourceCattura_CaptureFailed

    End Sub

Gestore di evento CaptureImageCompletend

Private Sub CaSourceCattura_CaptureImageCompleted(ByVal sender As Object, ByVal e As CaptureImageCompletedEventArgs)



        imageBrush.ImageSource = e.Result



    End Sub


Gestore di evento in caso di fallimento
  Private Sub CaSourceCattura_CaptureFailed(ByVal sender As Object, ByVal e As ExceptionRoutedEventArgs)

        'Gestione errore

    End Sub

C#
private void BtnRilevaImmagine_Click(object sender, RoutedEventArgs e)

        {

            //Rilevo l'immagine

            RctVisualizzaCam.Fill = imageBrush;

            if (CaptureDeviceConfiguration.RequestDeviceAccess() && CaSourceCattura.VideoCaptureDevice != null)

            {

                CaSourceCattura.Start();

                if (CaSourceCattura.VideoCaptureDevice != null && CaSourceCattura.State == CaptureState.Started)

                {

                    CaSourceCattura.CaptureImageAsync();

                }



            }

            CaSourceCattura.CaptureImageCompleted += new EventHandler<CaptureImageCompletedEventArgs>(CaSourceCattura_CaptureImageCompleted);

            CaSourceCattura.CaptureFailed += new EventHandler<ExceptionRoutedEventArgs>(CaSourceCattura_CaptureFailed);



        }

Gestore di evento in caso di completamento positivo
void CaSourceCattura_CaptureImageCompleted(object sender, CaptureImageCompletedEventArgs e)

        {

            imageBrush.ImageSource = e.Result;

        }


Gestore di evento in caso di fallimento
void CaSourceCattura_CaptureFailed(object sender, ExceptionRoutedEventArgs e)

        {

            //Gestione errore

        }


A questo punto non ci resta che testare il nostro applicativo, avviamo il programma e facciamo le prove.

Conclusioni

L’articolo ha voluto fornire le basi per utilizzare la webcam e l’audio nelle applicazioni Silverlight versione 4 o successiva, tramite il linguaggio di programmazione VB.Net e C#.
Le varie classi messe a disposizione offrono al programmatore interessanti possibilità di realizzare applicazioni avanzate.

Nessun commento: