C, GTK: отображение потока изображений RGB со скоростью ‹ 60 кадров в секунду

Я разрабатываю приложение, которое будет получать изображения с камеры и отображать их в окне GTK.

Камера передает необработанные изображения RGB (3 байта на пиксель, без альфа-канала, фиксированный размер) с переменной частотой кадров (1–50 кадров в секунду).

Я уже сделал все эти аппаратные вещи, и теперь у меня есть функция обратного вызова, которая вызывается с каждым новым изображением, снятым камерой.

Какой самый простой, но достаточно быстрый способ отобразить эти изображения в моем окне?

Вот что я уже пробовал:

  • использование gdk_draw_rgb_image() в области рисования gtk: в основном работало, но визуализировалось так медленно, что процессы рисования перекрывались, и приложение аварийно завершало работу после первых нескольких кадров, даже при скорости захвата 1 кадр/с.

  • выделение GdkPixbuf для каждого нового кадра и вызов gtk_image_set_from_pixbuf() для виджета изображения gtk: отображается только первый кадр, затем я не вижу изменений в окне. Может быть ошибка в моем коде, но не знаю, будет ли это достаточно быстро.

  • использование Cairo (cairo_set_source_surface(), затем cairo_paint()): казалось довольно быстрым, но изображение выглядело полосатым, не знаю, совместим ли формат изображения.

В настоящее время я думаю о том, чтобы попробовать что-то вроде gstreamer и обрабатывать эти изображения как видеопоток, но я не уверен, похоже ли это на излишество для моего простого механизма.

Заранее благодарю за любой совет!


person lynix    schedule 13.01.2012    source источник
comment
Cairo определяет свои пиксели поверхности изображения CAIRO_FORMAT_RGB24 с точки зрения 32-битных слов, поэтому в памяти на машине с прямым порядком байтов пиксели будут BGR0BGR0, вы, вероятно, используете реверс или не вставляете 0 байт, отсюда удаление.   -  person ergosys    schedule 16.01.2012
comment
@lynix Мне нужно написать то же самое. Можете ли вы поделиться, как в cairo получить веб-камеру?   -  person inckka    schedule 18.02.2016
comment
@inckka: С тех пор прошло 4 года, и ваш вопрос слишком общий, чтобы кто-то мог дать вам точный ответ. Моя конкретная проблема была решена таким образом.   -  person lynix    schedule 18.02.2016
comment
@lynix Где вы вызываете функцию img_update? Внутри основного с обратным вызовом разоблачения?   -  person inckka    schedule 19.02.2016


Ответы (2)