Estrarre e salvare singole immagini da una ripresa video mediante WebCam effettuata con il Componente gb.media: differenze tra le versioni
Nessun oggetto della modifica |
Nessun oggetto della modifica |
||
| Riga 1: | Riga 1: | ||
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''. | 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ò, sono disponibili alcune modalità | ||
===Usare il metodo "''.GetScreenshot( )''" della Classe "''DesktopWindow''" per catturare singole immagini dal video, e utilizzare una ''DrawingArea'' per mostrare la ripresa video=== | |||
Con questa modalità 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''. | |||
<BR>E' necessario attivare nell'applicazione Gambas i Componenti "''gb.desktop''" e "''gb.desktop.x11''". <SUP>[[[#Note|Nota 1]]]</sup> | <BR>E' necessario attivare nell'applicazione Gambas i Componenti "''gb.desktop''" e "''gb.desktop.x11''". <SUP>[[[#Note|Nota 1]]]</sup> | ||
| Riga 82: | Riga 87: | ||
pc[i].Save(drc &/ "picture_" & CStr(i) & ".png", 100) | pc[i].Save(drc &/ "picture_" & CStr(i) & ".png", 100) | ||
Next | Next | ||
'''End''' | |||
===Usare il metodo "''.GetLastImage( )''" della Classe "''MediaControl''" per catturare singole immagini dal video, ma senza utilizzare una ''DrawingArea''=== | |||
Quest'altra modalità prevede che: | |||
* non sia utilizzata una ''DrawingArea'', come superficie ove mostrare la ripresa video, bensì una superficie generata automaticamente da ''GStreamer''; | |||
* sia utilizzato il metodo "''.GetLastImage( )''" della Classe "''MediaControl''" per catturare singole immagini dal video. | |||
Poiché è risultato che il Componente "''gb.qt4''" può dare problemi all'uso del predetto metodo "''.GetLastImage( )''", è opportuno attivare in alternativa il Componente "''gb.gui''". | |||
Mostriamo di seguito un esempio pratico: | |||
Private pl As MediaPipeline | |||
Private snk As MediaControl | |||
'''Public''' Sub Form_Open() | |||
Dim src As MediaControl | |||
Dim ftr As MediaFilter | |||
pl = New MediaPipeline | |||
src = New MediaControl(pl, "v4l2src") | |||
ftr = New MediaFilter(pl) | |||
ftr.Filter = "video/x-raw,width=640,height=480,framerate=30/1" | |||
snk = New MediaControl(pl, "xvimagesink") | |||
src.LinkTo(ftr) | |||
ftr.LinkTo(snk) | |||
'''End''' | |||
'''Public''' Sub Button1_Click() | |||
Dim i As Integer | |||
Dim drc, s As String | |||
drc = "/tmp/immagini" | |||
If Not Exist(drc) Then | |||
Mkdir drc | |||
Else | |||
For Each s In Dir(drc, "immagine_*", gb.file) | |||
Kill drc &/ s | |||
Next | |||
Endif | |||
pl.Play() | |||
While pl.State = Media.Playing | |||
snk.GetLastImage().Save(drc &/ "immagine_" & CStr(I) & ".png") | |||
Print "Schermata video salvata in memoria..." | |||
Wait 0.5 | |||
Inc i | |||
Wend | |||
'''End''' | |||
'''Public''' Sub Button2_Click() | |||
pl.Stop() | |||
pl.Close() | |||
'''End''' | '''End''' | ||
Versione delle 16:11, 29 giu 2017
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ò, sono disponibili alcune modalità
Usare il metodo ".GetScreenshot( )" della Classe "DesktopWindow" per catturare singole immagini dal video, e utilizzare una DrawingArea per mostrare la ripresa video
Con questa modalità 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
Usare il metodo ".GetLastImage( )" della Classe "MediaControl" per catturare singole immagini dal video, ma senza utilizzare una DrawingArea
Quest'altra modalità prevede che:
- non sia utilizzata una DrawingArea, come superficie ove mostrare la ripresa video, bensì una superficie generata automaticamente da GStreamer;
- sia utilizzato il metodo ".GetLastImage( )" della Classe "MediaControl" per catturare singole immagini dal video.
Poiché è risultato che il Componente "gb.qt4" può dare problemi all'uso del predetto metodo ".GetLastImage( )", è opportuno attivare in alternativa il Componente "gb.gui".
Mostriamo di seguito un esempio pratico:
Private pl As MediaPipeline
Private snk As MediaControl
Public Sub Form_Open()
Dim src As MediaControl
Dim ftr As MediaFilter
pl = New MediaPipeline
src = New MediaControl(pl, "v4l2src")
ftr = New MediaFilter(pl)
ftr.Filter = "video/x-raw,width=640,height=480,framerate=30/1"
snk = New MediaControl(pl, "xvimagesink")
src.LinkTo(ftr)
ftr.LinkTo(snk)
End
Public Sub Button1_Click()
Dim i As Integer
Dim drc, s As String
drc = "/tmp/immagini"
If Not Exist(drc) Then
Mkdir drc
Else
For Each s In Dir(drc, "immagine_*", gb.file)
Kill drc &/ s
Next
Endif
pl.Play()
While pl.State = Media.Playing
snk.GetLastImage().Save(drc &/ "immagine_" & CStr(I) & ".png")
Print "Schermata video salvata in memoria..."
Wait 0.5
Inc i
Wend
End
Public Sub Button2_Click()
pl.Stop()
pl.Close()
End
Note
[1] Vedi anche questa pagina della WIKI: Generare un file immagine da una DrawingArea