C, GTK: отображать поток изображений RGB со скоростью <60 кадров в секунду - PullRequest
5 голосов
/ 13 января 2012

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

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

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

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

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

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

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

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

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

Заранее спасибо за любой совет!

Ответы [ 2 ]

4 голосов
/ 13 января 2012

Весь API GdkRGB устарел, так что это, вероятно, не рекомендуемый способ решения этой проблемы.

То же самое относится к вызову рендеринга pixbuf . Документация там указывает на Каир, поэтому решение, похоже, заключается в том, чтобы продолжить расследование, почему ваше изображение выглядело некорректно при визуализации в Каире.

1 голос
/ 17 января 2012

Размотка верна, cairo - это то, что нужно, если вы хотите что-то, что будет работать в GTK2 и GTK3 Поскольку ваши сэмплы RGB без альфа, вы должны использовать формат CAIRO_FORMAT_RGB24 . Убедитесь, что вы рисуете поверхность в этом формате. Также постарайтесь убедиться, что вы не постоянно выделяете / уничтожаете поверхностный буфер, если входное изображение имеет одинаковый размер.

...