Estrarre e salvare singole immagini da una ripresa video mediante WebCam effettuata con il Componente gb.media

Da Gambas-it.org - Wikipedia.

A volte può essere necessario estrarre e salvare in appositi file singole immagini di una ripresa video effettuata mediante una WebCam con il Componente gb.media . Per fare ciò, si raccoglierà mediante il metodo ".GetScreenshot( )" della Classe DesktopWindow quanto appare sulla superficie video utilizzata. Per individuare utilmente tale superficie video, è necessario individuare il suo handle.
E' necessario attivare nell'applicazione Gambas i Componenti "gb.desktop" e "gb.desktop.x11". [Nota 1]

Mostriamo di seguito un esempio pratico, nel quale si salverà in un vettore di tipo Picture[ ] ogni 300 millesimi di secondo un'immagine del video, mostrato all'interno di una DrawingArea. Al termine della ripresa video si provvederà a salvare ciascuna immagine, salvata nel predetto vettore, in un file immagine di tipo png.

Private dr As DrawingArea
Private pl As MediaPipeline
Private pc As New Picture[]


Public Sub Form_Open()
 
Dim src, tim, snk As MediaControl
Dim ftr As MediaFilter
 
 With dr = New DrawingArea(Me)
   .X = 10
   .Y = 10
   .W = 640
   .H = 480
' Affinche la "DrawingArea" mostri il video, è assolutamente necessario attribuire un colore qualsiasi alla sua proprietà ".Background":
   .Background = Color.Black
 End With
 
 pl = New MediaPipeline 
 
 src = New MediaControl(pl, "v4l2src")
 ftr = New MediaFilter(pl, "video/x-raw,width=640,height=480,framerate=30/1")
' Mostra nel video anche il tempo trascorso dall'avvio della ripresa:
 tim = New MediaControl(pl, "timeoverlay")
 snk = New MediaControl(pl, "xvimagesink")
 
' Colleghiamo i quattro plug-in di "GStreamer":
 src.LinkTo(tim)
 tim.LinkTo(ftr)
 ftr.LinkTo(snk)
 snk.SetWindow(dr)
  
End


Public Sub Button1_Click()
 
 Dim dw As DesktopWindow
 
' Avvia la ripresa video della WebCam:
  pl.State = Media.Playing
  pl.Play()
 
' Resta in attesa che la WebCam avvi effettivamente la ripresa video:
  Wait 2
  
  dw = New DesktopWindow(dr.Handle)
 
  While pl.State = Media.Playing
' Cattura una schermata del contenuto video mostrato in quel momento dalla "DrawingArea":
    pc.Push(dw.GetScreenshot(True))
' La cattura della schermata avviene ogni 300 millisecondi:
    Wait 0.3
  Wend
     
End


Public Sub Button2_Click()    ' Questo evento arresta la ripresa video e salva ogni picture in un file .png
 
 Dim i As Integer
 Dim drc, s As String
  
  drc = "/tmp/imago"
  
  pl.Stop
 
  If Not Exist(drc) Then
    Mkdir drc
  Else
    For Each s In Dir(drc, "picture_*", gb.file)
      Kill drc &/ s
    Next
  Endif
 
  For i = 0 To pc.Max
    pc[i].Save(drc &/ "picture_" & CStr(i) & ".png", 100)
  Next
  
End



Note

[1] Vedi anche questa pagina della WIKI: Generare un file immagine da una DrawingArea