Differenze tra le versioni di "Estrarre e salvare singole immagini da una ripresa video mediante WebCam effettuata con il Componente gb.media"
Riga 98: | Riga 98: | ||
'''Public''' Sub Form_Open() | '''Public''' Sub Form_Open() | ||
− | Dim src As MediaControl | + | Dim src, cnv As MediaControl |
Dim ftr As MediaFilter | Dim ftr As MediaFilter | ||
Dim dr As DrawingArea | Dim dr As DrawingArea | ||
Riga 114: | Riga 114: | ||
src = New MediaControl(pl, "v4l2src") | src = New MediaControl(pl, "v4l2src") | ||
+ | src["device"] = "/dev/video0" | ||
ftr = New MediaFilter(pl) | ftr = New MediaFilter(pl) | ||
ftr.Filter = "video/x-raw,width=640,height=480,framerate=30/1" | ftr.Filter = "video/x-raw,width=640,height=480,framerate=30/1" | ||
− | + | cnv = New MediaControl(pl, "videoconvert") | |
snk = New MediaControl(pl, "xvimagesink") | snk = New MediaControl(pl, "xvimagesink") | ||
src.LinkTo(ftr) | src.LinkTo(ftr) | ||
− | ftr.LinkTo(snk) | + | ftr.LinkTo(cnv) |
+ | cnv.LinkTo(snk) | ||
<FONT Color=gray>' ''Imposta la DrawingArea come superficie ove mostrare la ripresa video:''</font> | <FONT Color=gray>' ''Imposta la DrawingArea come superficie ove mostrare la ripresa video:''</font> | ||
Riga 149: | Riga 151: | ||
snk.GetLastImage().Save(drc &/ "immagine_" & CStr(I) & ".png") | snk.GetLastImage().Save(drc &/ "immagine_" & CStr(I) & ".png") | ||
Print "Schermata video salvata nella cartella " & drc | Print "Schermata video salvata nella cartella " & drc | ||
+ | <FONT Color=gray>' ''Attende mezzo secondo per catturare un'altra immagine dalla ripresa video:''</font> | ||
Wait 0.5 | Wait 0.5 | ||
Inc i | Inc i | ||
Riga 177: | Riga 180: | ||
'''Public''' Sub Form_Open() | '''Public''' Sub Form_Open() | ||
− | Dim src, tim, snk As MediaControl | + | Dim src, tim, cnv, snk As MediaControl |
Dim ftr As MediaFilter | Dim ftr As MediaFilter | ||
Riga 192: | Riga 195: | ||
src = New MediaControl(pl, "v4l2src") | src = New MediaControl(pl, "v4l2src") | ||
+ | src["device"] = "/dev/video0" | ||
ftr = New MediaFilter(pl, "video/x-raw,width=640,height=480,framerate=30/1") | ftr = New MediaFilter(pl, "video/x-raw,width=640,height=480,framerate=30/1") | ||
<FONT Color=gray>' ''Mostra nel video anche il tempo trascorso dall'avvio della ripresa:''</font> | <FONT Color=gray>' ''Mostra nel video anche il tempo trascorso dall'avvio della ripresa:''</font> | ||
tim = New MediaControl(pl, "timeoverlay") | tim = New MediaControl(pl, "timeoverlay") | ||
+ | cnv = New MediaControl(pl, "videoconvert") | ||
snk = New MediaControl(pl, "xvimagesink") | snk = New MediaControl(pl, "xvimagesink") | ||
<FONT Color=gray>' ''Colleghiamo i quattro plug-in di "GStreamer":''</font> | <FONT Color=gray>' ''Colleghiamo i quattro plug-in di "GStreamer":''</font> | ||
− | src.LinkTo(tim) | + | src.LinkTo(ftr) |
− | tim.LinkTo( | + | ftr.LinkTo(tim) |
− | + | tim.LinkTo(cnv) | |
+ | cnv.LinkTo(snk) | ||
snk.SetWindow(dr) | snk.SetWindow(dr) | ||
Riga 265: | Riga 271: | ||
'''Public''' Sub Form_Open() | '''Public''' Sub Form_Open() | ||
− | Dim src As MediaControl | + | Dim src, cnv As MediaControl |
Dim ftr As MediaFilter | Dim ftr As MediaFilter | ||
Riga 271: | Riga 277: | ||
src = New MediaControl(pl, "v4l2src") | src = New MediaControl(pl, "v4l2src") | ||
− | + | src["device"] = "/dev/video0" | |
ftr = New MediaFilter(pl) | ftr = New MediaFilter(pl) | ||
ftr.Filter = "video/x-raw,width=640,height=480,framerate=30/1" | ftr.Filter = "video/x-raw,width=640,height=480,framerate=30/1" | ||
− | + | cnv = New MediaControl(pl, "videoconvert") | |
snk = New MediaControl(pl, "xvimagesink") | snk = New MediaControl(pl, "xvimagesink") | ||
src.LinkTo(ftr) | src.LinkTo(ftr) | ||
− | ftr.LinkTo(snk) | + | ftr.LinkTo(cnv) |
+ | cnv.LinkTo(snk) | ||
'''End''' | '''End''' |
Versione delle 15:26, 22 lug 2019
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. [Nota 1]
Per fare ciò, sono disponibili alcune modalità.
E' il caso di sottolineare che bisognerà creare progetti QT Application, altrimenti usando i Componenti GTK detti codici non funzioneranno a dovere.
Indice
- 1 Usare le Classi "MediaPlayer" e "MediaControl"
- 2 Usare il metodo ".GetLastImage( )" della Classe "MediaControl" per catturare singole immagini dal video, e utilizzare una DrawingArea per mostrare la ripresa video
- 3 Usare il metodo ".GetScreenshot( )" della Classe "DesktopWindow" per catturare singole immagini dal video, e utilizzare una DrawingArea per mostrare la ripresa video
- 4 Usare il metodo ".GetLastImage( )" della Classe "MediaControl" per catturare singole immagini dal video, ma senza utilizzare una DrawingArea
- 5 Note
Usare le Classi "MediaPlayer" e "MediaControl"
Innanzitutto è possibile usare le Classi "MediaPlayer" e "MediaControl". In particolare, per catturare le singole immagini, si utilizzerà in tal caso la sotto-proprietà ".Image" della proprietà "Video" della Classe "MediaPlayer".
Mostriamo di seguito un semplice esempio, nel quale verrà effettuata una ripresa video con una webcam. La ripresa sarà mostrata all'interno di una DrawingArea, e sarà salvata ogni secondo un'immagine della ripresa all'interno di un file immagine di formato PNG.
Private pl As MediaPlayer Private im As MediaControl Private tb As ToggleButton Private tempus As Timer Private i As Integer Public Sub Form_Open() Dim drar As DrawingArea Dim flt As MediaFilter With Me .W = 700 .H = 600 End With With drar = New DrawingArea(Me) .X = 10 .Y = 10 .W = 680 .H = 480 .Border = Border.Plain .Background = Color.Transparent End With With tb = New ToggleButton(Me) As "Tasto" .X = 500 .Y = 550 .W = 80 .H = 40 .Text = "Avvia" End With pl = New MediaPlayer As "MediaPlayer" flt = New MediaFilter(pl, "video/x-raw,width=640,height=480,framerate=30/1") im = New MediaControl(pl, "xvimagesink") pl.Video.Output = im pl.URL = "v4l2:///dev/video0" im.SetWindow(drar) End Public Sub Tasto_Click() If tb.Value Then pl.Play With tempus = New Timer As "Tempus" .Delay = 1000 .Start() End With Else pl.Stop pl.Close tempus.Stop Endif End Public Sub Tempus_Timer() Dim img As Image Dim s As String img = pl.Video.Image Inc i s = CStr(i) img.Save("/tmp/foto_" & s & ".png", 100) Write #File.out, "\rImmagini catturate: " & s End
Usare il metodo ".GetLastImage( )" della Classe "MediaControl" per catturare singole immagini dal video, e utilizzare una DrawingArea per mostrare la ripresa video
Quest'altra modalità prevede che:
- sia utilizzata una DrawingArea, come superficie ove mostrare la ripresa video;
- sia utilizzato il metodo ".GetLastImage( )" della Classe "MediaControl" per catturare singole immagini dal video.
Mostriamo di seguito un esempio pratico, nel quale la cattura delle immagini dalla ripresa video avviene ogni 500 millisecondi:
Private pl As MediaPipeline Private snk As MediaControl Public Sub Form_Open() Dim src, cnv As MediaControl Dim ftr As MediaFilter Dim dr As DrawingArea With dr = New DrawingArea(Me) .X = 10 .Y = 10 .W = 640 .H = 480 ' Affinché 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") src["device"] = "/dev/video0" ftr = New MediaFilter(pl) ftr.Filter = "video/x-raw,width=640,height=480,framerate=30/1" cnv = New MediaControl(pl, "videoconvert") snk = New MediaControl(pl, "xvimagesink") src.LinkTo(ftr) ftr.LinkTo(cnv) cnv.LinkTo(snk) ' Imposta la DrawingArea come superficie ove mostrare la ripresa video: snk.SetWindow(dr) 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 nella cartella " & drc ' Attende mezzo secondo per catturare un'altra immagine dalla ripresa video: Wait 0.5 Inc i Wend End Public Sub Button2_Click() pl.Stop() pl.Close() End
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 [Nota 2] 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".
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, cnv, snk As MediaControl Dim ftr As MediaFilter With dr = New DrawingArea(Me) .X = 10 .Y = 10 .W = 640 .H = 480 ' Affinché 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") src["device"] = "/dev/video0" 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") cnv = New MediaControl(pl, "videoconvert") snk = New MediaControl(pl, "xvimagesink") ' Colleghiamo i quattro plug-in di "GStreamer": src.LinkTo(ftr) ftr.LinkTo(tim) tim.LinkTo(cnv) cnv.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.
Mostriamo di seguito un esempio pratico:
Private pl As MediaPipeline Private snk As MediaControl Public Sub Form_Open() Dim src, cnv As MediaControl Dim ftr As MediaFilter pl = New MediaPipeline src = New MediaControl(pl, "v4l2src") src["device"] = "/dev/video0" ftr = New MediaFilter(pl) ftr.Filter = "video/x-raw,width=640,height=480,framerate=30/1" cnv = New MediaControl(pl, "videoconvert") snk = New MediaControl(pl, "xvimagesink") src.LinkTo(ftr) ftr.LinkTo(cnv) cnv.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 nella cartella " & drc Wait 0.5 Inc i Wend End Public Sub Button2_Click() pl.Stop() pl.Close() End
Note
[1] Vedi anche questa pagina della WIKI: Catturare un'immagine con una webcam mediante il Componente gb.media
[2] Vedi anche questa pagina della WIKI: Generare un file immagine da una DrawingArea