2012-01-13 13 views
5

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(), quindi cairo_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!

+0

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

+0

@lynix Ho bisogno di codificare la stessa cosa. Puoi condividere come cairo per ottenere feed webcam? – inckka

+0

@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

risposta

4

L'intera API GdkRGB sembra essere deprecato, in modo che probabilmente non è il metodo consigliato per risolvere questo problema.

Lo stesso vale per la chiamata a render a pixbuf. La documentazione in questione punta al Cairo, quindi la soluzione sembra essere quella di continuare a indagare sul motivo per cui la tua immagine sembrava errata quando resa dal Cairo.

+0

Grazie, questo spiega perché non ho potuto trovare alcun tutorial completo per le cose GdkRGB. Vengo con cairo ora, chiedo solo se è abbastanza veloce per il 50 fps – lynix

1

rilassarsi è giusto, Il Cairo è la strada da percorrere se si vuole qualcosa che funziona in GTK2 e GTK3. Poiché i campioni sono RGB senza alfa, è necessario utilizzare il formato CAIRO_FORMAT_RGB24. Assicurati che la superficie che dipingi sia in quel formato. Inoltre, cerca di assicurarti di non allocare/distruggere costantemente il buffer di superficie se l'immagine di input mantiene le stesse dimensioni.

+0

Grazie, ho iniziato ad attuare con cairo. – lynix

+0

Siccome sono nuovo nello stackoverflow, devo fare domande su come risolvere un problema che incontro con cairo qui o in una nuova discussione? :) – lynix

+0

@lynix Se hai una nuova domanda, pubblica una nuova domanda. Stack Overflow si basa su * domande *, non su "discussioni". Non è un forum di discussione. – unwind

Problemi correlati