Estrarre e salvare singole immagini da una ripresa video mediante WebCam effettuata con il Componente gb.media
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
While pl.State = Media.Playing
With dw = New DesktopWindow(dr.Handle)
' Cattura una schermata del contenuto video mostrato in quel momento dalla "DrawingArea":
pc.Push(.GetScreenshot(True))
End With
' 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