Differenze tra le versioni di "Catturare un'immagine con una webcam mediante il Componente gb.media"

Da Gambas-it.org - Wikipedia.
Riga 1: Riga 1:
Per catturare un'immagine (come se in sostanza si scattasse una foto) con una webcam mediante il Componente ''gb.media'' <SUP>&#091;[[#Note|Nota 1]]&#093;</sup>, si utilizzeranno le Classi ''MediaPipeline'' e ''MediaControl''.
+
Per catturare un'immagine (come se in sostanza si scattasse una foto) con una webcam mediante il Componente ''gb.media'' <SUP>&#091;[[#Note|Nota 1]]&#093;</sup> e salvarla poi in un file immagine, si potranno utilizzare le Classi ''MediaPipeline'' e ''MediaControl''.
  
 
Mostriamo un esempio pratico:
 
Mostriamo un esempio pratico:
Riga 6: Riga 6:
 
   Dim pl As MediaPipeline
 
   Dim pl As MediaPipeline
 
   Dim src, enc, snk As MediaControl
 
   Dim src, enc, snk As MediaControl
 +
  Dim primofile As String
 
    
 
    
   pl = New MediaPipeline
+
   primofile = "/tmp/primofile"
 
 
  src = New MediaControl(pl, "v4l2src")
 
<FONT Color=gray>' ''Cattura un fotogramma dalla webcam e lo salva come immagine jpeg:''</font>
 
  src["num-buffers"] = 1
 
  enc = New MediaControl(pl, "jpegenc")
 
  snk = New MediaControl(pl, "filesink")
 
  snk["location"] = "<FONT Color=gray>''/percorso/del/file/immagine.jpg''</font>"
 
 
 
<FONT Color=gray>' ''Colleghiamo fra loro i plugin di "GStreamer":''</font>
 
  src.LinkTo(enc)
 
  enc.LinkTo(snk)
 
 
 
<FONT Color=gray>' ''Effettua la ripresa dell'immagine:''</font>
 
  pl.Play()
 
 
 
<FONT Color=gray>' ''Per consentire la creazione definitiva del file immagine, è necessario impostare un ciclo infinito.''
 
' ''La chiusura del programma dovrà avvenire manualmente da parte dell'utente.''</font>
 
  Do
 
    Wait 0.01
 
  Loop
 
 
 
'''End'''
 
 
 
Si è visto sopra che risulta necessaria l'impostazione di un ciclo infinito, senza il quale il file immagine, seppur generato, non verrà riempito dei previsti dati immagine del protocollo JPEG. Qualora non si intenda inserire tale ciclo, ma si preferisca far chiudere il programma automaticamente da codice, si potranno prevedere due diverse alternative.
 
 
 
La prima prevede l'inserimento dell'istruzione "''Input''" al posto del ciclo. Ciò però non è sufficiente a garantire la persistenza del file immagine generato e popolato dei necessari dati immagine. Per garantire la persistenza del file ''pieno'' si potrà inserire dopo l'istruzione "''Input''" la funzione "''Copy''" per copiare il nuovo file immagine in un altro identico, ma di nome diverso.
 
'''Public''' Sub Main()
 
 
 
  Dim pl As MediaPipeline
 
  Dim src, enc, snk As MediaControl
 
  Dim s As String
 
 
    
 
    
 
   pl = New MediaPipeline  
 
   pl = New MediaPipeline  
Riga 47: Riga 17:
 
   enc = New MediaControl(pl, "jpegenc")
 
   enc = New MediaControl(pl, "jpegenc")
 
   snk = New MediaControl(pl, "filesink")
 
   snk = New MediaControl(pl, "filesink")
   snk["location"] = "<FONT Color=gray>''/percorso/del/file/immagine.jpg''</font>"
+
   snk["location"] = primofile
 
    
 
    
 
  <FONT Color=gray>' ''Colleghiamo fra loro i plugin di "GStreamer":''</font>
 
  <FONT Color=gray>' ''Colleghiamo fra loro i plugin di "GStreamer":''</font>
Riga 55: Riga 25:
 
  <FONT Color=gray>' ''Effettua la ripresa dell'immagine:''</font>
 
  <FONT Color=gray>' ''Effettua la ripresa dell'immagine:''</font>
 
   pl.Play()
 
   pl.Play()
 +
  sleep 1
 
    
 
    
  <FONT Color=#B22222>Input s</font>
+
   Copy primofile To "<FONT Color=gray>''/percorso/del/file/immagine.jpg''</font>"
 
 
   Copy "<FONT Color=gray>''/percorso/del/file/immagine.jpg''</font>" To "<FONT Color=gray>''/percorso/del/copiato/e/rinominato/file/immagine.jpg''</font>"
 
 
    
 
    
   pl.Stop
+
   pl.Stop()
   pl.Close
+
   pl.Close()
 +
  Print "Cattura immagine effettuata"
 
    
 
    
 
  '''End'''
 
  '''End'''
  
 +
Si è visto sopra che risulta necessario l'uso dell'istruzione "''Copy''", la quale copia il primo file immagine generato ed ancora contenente gli utili dati immagine del protocollo JPEG, in un altro file .jpg. Questa procedura è necessaria, poiché risulta che il primo file immagine generato - alla chiusura del programma - perde i suoi dati.
  
L'altra possibilità consiste nel prevedere al termine del codice l'inserimento della funzione esterna "''_exit( )''", dichiarata nel file header "''/usr/include/unistd.h''".
+
Qualora non si intenda utilizzare la funzione "''Copy''", si potrà utilizzare un'altra modalità che prevede al termine del codice l'inserimento della funzione esterna "''_exit( )''", dichiarata nel file header "''/usr/include/unistd.h''".
 
  <FONT Color=gray>' ''void _exit (int __status)''
 
  <FONT Color=gray>' ''void _exit (int __status)''
 
  ' ''Terminate program execution with the low-order 8 bits of STATUS.''</font>
 
  ' ''Terminate program execution with the low-order 8 bits of STATUS.''</font>
Riga 92: Riga 63:
 
  <FONT Color=gray>' ''Effettua la ripresa dell'immagine:''</font>
 
  <FONT Color=gray>' ''Effettua la ripresa dell'immagine:''</font>
 
   pl.Play()
 
   pl.Play()
 +
  Sleep 1
 
    
 
    
 
  <FONT Color=gray>' ''Si utilizza la funzione esterna "_exit( )" per uscire dal programma con la sicurezza che il file immagine sarà realizzato:''</font>
 
  <FONT Color=gray>' ''Si utilizza la funzione esterna "_exit( )" per uscire dal programma con la sicurezza che il file immagine sarà realizzato:''</font>

Versione delle 02:07, 11 ago 2017

Per catturare un'immagine (come se in sostanza si scattasse una foto) con una webcam mediante il Componente gb.media [Nota 1] e salvarla poi in un file immagine, si potranno utilizzare le Classi MediaPipeline e MediaControl.

Mostriamo un esempio pratico:

Public Sub Main()
 
 Dim pl As MediaPipeline
 Dim src, enc, snk As MediaControl
 Dim primofile As String
 
  primofile = "/tmp/primofile"
  
  pl = New MediaPipeline 
  
  src = New MediaControl(pl, "v4l2src")
' Cattura un fotogramma dalla webcam e lo salva come immagine jpeg:
  src["num-buffers"] = 1
  enc = New MediaControl(pl, "jpegenc")
  snk = New MediaControl(pl, "filesink")
  snk["location"] = primofile
  
' Colleghiamo fra loro i plugin di "GStreamer":
  src.LinkTo(enc)
  enc.LinkTo(snk)
  
' Effettua la ripresa dell'immagine:
  pl.Play()
  sleep 1
  
  Copy primofile To "/percorso/del/file/immagine.jpg"
  
  pl.Stop()
  pl.Close()
  Print "Cattura immagine effettuata"
  
End

Si è visto sopra che risulta necessario l'uso dell'istruzione "Copy", la quale copia il primo file immagine generato ed ancora contenente gli utili dati immagine del protocollo JPEG, in un altro file .jpg. Questa procedura è necessaria, poiché risulta che il primo file immagine generato - alla chiusura del programma - perde i suoi dati.

Qualora non si intenda utilizzare la funzione "Copy", si potrà utilizzare un'altra modalità che prevede al termine del codice l'inserimento della funzione esterna "_exit( )", dichiarata nel file header "/usr/include/unistd.h".

' void _exit (int __status)
' Terminate program execution with the low-order 8 bits of STATUS.
Private Extern _exit(__status As Integer) In "libc:6"


Public Sub Main()
  
 Dim pl As MediaPipeline
 Dim src, enc, snk As MediaControl
  
  pl = New MediaPipeline 
  
  src = New MediaControl(pl, "v4l2src")
' Cattura un fotogramma dalla webcam e lo salva come immagine jpeg:
  src["num-buffers"] = 1
  enc = New MediaControl(pl, "jpegenc")
  snk = New MediaControl(pl, "filesink")
  snk["location"] = "/percorso/del/file/immagine.jpg"
  
' Colleghiamo fra loro i plugin di "GStreamer":
  src.LinkTo(enc)
  enc.LinkTo(snk)
  
' Effettua la ripresa dell'immagine:
  pl.Play()
  Sleep 1
  
' Si utilizza la funzione esterna "_exit( )" per uscire dal programma con la sicurezza che il file immagine sarà realizzato:
  _exit(0)
  
End



Note

[1] Vedere al riguardo anche questa pagina della wiki: Estrarre e salvare singole immagini da una ripresa video mediante WebCam effettuata con il Componente gb.media