Sto sviluppando un'applicazione che deve ricevere immagini da un dispositivo della fotocamera e visualizzarle in una finestra GTK.C, GTK: flusso video di immagini RGB a <60 fps
La telecamera fornisce immagini prime RGB (3 byte per pixel, senza canale alfa, dimensione fissa) ad un frame rate variabile (1-50 fps).
ho già fatto tutta quella roba hardware e ora hanno una funzione di callback che viene chiamato con ogni nuova immagine acquisita dalla fotocamera.
Qual è il modo abbastanza easyest ma veloce per visualizzare quelle immagini nella mia finestra?
Ecco quello che ho già provato:
utilizzando
gdk_draw_rgb_image()
su un'area di disegno gtk: fondamentalmente lavorato, ma reso così lenta che i processi di disegno sovrapposti e l'applicazione si è schiantato dopo i primi fotogrammi, anche con una frequenza di acquisizione di 1 fps.allocare una GdkPixbuf per ogni nuovo fotogramma e chiamando
gtk_image_set_from_pixbuf()
su un'immagine widget gtk: visualizza solo il primo fotogramma, poi vedo alcun cambiamento nella finestra. Può essere un bug nel mio codice, ma non so se sarà abbastanza veloce.utilizzando Cairo (
cairo_set_source_surface()
, quindicairo_paint()
): sembrava piuttosto veloce, ma l'immagine sembrava strisce, non so se il formato dell'immagine è compatibile.
Attualmente sto pensando di provare qualcosa come gstreamer e trattare le immagini come un flusso video, ma non sono sicuro se questo è come un peso inutile per il mio semplice meccanismo.
Grazie in anticipo per qualsiasi consiglio!
Cairo definisce i suoi pixel di superficie dell'immagine CAIRO_FORMAT_RGB24 in termini di parole a 32 bit, quindi in memoria su una piccola macchina endian, i pixel saranno BGR0BGR0, probabilmente si sta utilizzando il contrario o non si inserisce il byte 0, quindi il stripping. – ergosys
@lynix Ho bisogno di codificare la stessa cosa. Puoi condividere come cairo per ottenere feed webcam? – inckka
@inckka: Sono passati 4 anni da allora e la tua domanda è troppo generica perché qualcuno possa darti una risposta precisa. Il mio problema specifico è stato risolto [in questo modo] (http://pastebin.com/QMCgaaUT). – lynix