2012-01-13 15 views
5

Estoy desarrollando una aplicación que recibirá imágenes de un dispositivo de cámara y las mostrará en una ventana GTK.C, GTK: muestra la secuencia de imágenes RGB a <60 fps

La cámara ofrece imágenes RGB sin formato (3 bytes por píxel, sin canal alfa, tamaño fijo) a una velocidad de cuadro variable (1-50 fps).

Ya he hecho todas las cosas de hardware y ahora tengo una función de devolución de llamada que se llama con cada nueva imagen capturada por la cámara.

¿Cuál es la forma más fácil pero rápida de mostrar esas imágenes en mi ventana?

Esto es lo que yo ya probé:

  • usando gdk_draw_rgb_image() en un área de dibujo GTK: básicamente trabajaban, pero si se ven tan lento que los procesos de embutición solapan y se bloqueó la aplicación después de los primeros fotogramas, incluso a una velocidad de captura de 1 fps.

  • la asignación de un GdkPixbuf para cada nueva trama y llamando gtk_image_set_from_pixbuf() en un widget GTK imagen: sólo muestra el primer cuadro, entonces no veo ningún cambio en la ventana. Puede ser un error en mi código, pero no sé si será lo suficientemente rápido.

  • usando Cairo (cairo_set_source_surface(), entonces cairo_paint()): parecía bastante rápido, pero la imagen parecían rayas, no sé si el formato de imagen es compatible.

Actualmente estoy pensando en probar algo así como gstreamer y el tratamiento de esas imágenes como una secuencia de vídeo, pero no estoy seguro de si esto es como una exageración para mi sencillo mecanismo.

Gracias de antemano por cualquier consejo!

+0

Cairo define sus píxeles de superficie de imagen CAIRO_FORMAT_RGB24 en términos de palabras de 32 bits, por lo que en la memoria de una pequeña máquina endian, los píxeles serán BGR0BGR0, probablemente esté utilizando el reverso, o no estén poniendo 0 byte, de ahí pelar. – ergosys

+0

@lynix Necesito codificar la misma cosa. ¿Puedes compartir cómo hacer cairo para obtener la alimentación de la cámara web? – inckka

+0

@inckka: Han pasado 4 años desde entonces, y su pregunta es demasiado general para que cualquiera pueda darle una respuesta precisa. Mi problema específico ha sido resuelto [de esta manera] (http://pastebin.com/QMCgaaUT). – lynix

Respuesta

4

La API GdkRGB completa parece estar obsoleta, por lo que probablemente no sea la forma recomendada de solucionar esto.

Lo mismo ocurre con la llamada al render a pixbuf. La documentación allí apunta a El Cairo, por lo que parece que la solución es continuar investigando por qué su imagen se veía incorrecta cuando fue presentada por El Cairo.

+0

Gracias, esto explica por qué no pude encontrar ningún tutorial completo para cosas GdkRGB. Iré con El Cairo ahora, solo me pregunto si es lo suficientemente rápido para los 50 fps – lynix

1

unwind tiene razón, cairo es el camino a seguir si quiere algo que funcione en GTK2 y GTK3. Como sus muestras son RGB sin alfa, debe usar el formato CAIRO_FORMAT_RGB24. Asegúrese de que la superficie que pinta esté en ese formato. También intente asegurarse de no asignar/destruir constantemente el búfer de superficie si la imagen de entrada conserva el mismo tamaño.

+0

Gracias, comencé a implementar con El Cairo. – lynix

+0

Como soy nuevo en stackoverflow, ¿debo hacer preguntas sobre cómo resolver un problema que encuentro con El Cairo aquí o en un nuevo hilo? :) – lynix

+0

@lynix Si tiene una nueva pregunta, publique una nueva pregunta. Stack Overflow se basa en * preguntas *, no "hilos". No es un foro de discusión. – unwind

Cuestiones relacionadas