Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Вывод картинки через OpenGL

399
14 августа 2010 года
KIV
432 / / 20.01.2009
Пишу приложение под Linux, которое выводит картинку с веб-камеры на экран. Для создания интерфейса (у меня не только окно с видео, но и окно настроек) использую GTK. Сначала для вывода картинки выводил её из буфера средствами GtkImage, но после того как я добавил ресайзинг картинки (например, для вывода на весь экран) приложение стало жрать 20 процентов ресурсов 4-х ядерного процессора. Тогда я решил выводить и ресайзить изображение через OpenGL. Если отбросить все тонкости GTK и gtkglext (там ничего интересного - просто создаю контекст OpenGL. никаких дополнительных настроек не произвожу), то выводит картинку вот такой код (это фрагмент функции перерисовки окна):
 
Код:
glPixelZoom((double) width / capture_device->video_width, (double) height / capture_device->video_height);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glDrawPixels(capture_device->video_width, capture_device->video_height,  GL_RGB, GL_UNSIGNED_BYTE, video_buffer);

Где video_buffer - буфер с картинкой.
Ресурсоёмкость вывода заметно уменьшилась - 0% даже в полноэкранном режиме. Однако возникла проблема: изображение выводится начиная с левого нижнего угла окна и перевёрнутое. Как заставить изображение выводиться нормально? Ну ведь не переворотом в буфере до вывода же!

И за одно как средствами OpenGL выводить изображение не RGB, а YUYV? А то драйвер как то неправильно конвертирует из YUYV в RGB, да и все программы используют входной формат YUYV. Вполне возможно и потому, что драйвер плохо преобразует в RGB.
399
15 августа 2010 года
KIV
432 / / 20.01.2009
Проблему с поворотом решил. Надо было написать:
 
Код:
glRasterPos2d(-1.0, 1.0);
glPixelZoom((gdouble) width / capture_device->video_width, -((gdouble) height / capture_device->video_height));
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glDrawPixels(capture_device->video_width, capture_device->video_height,  GL_RGB, GL_UNSIGNED_BYTE, video_buffer);

Вопрос про вывод YUYV остаётся в силе. Мне бы подошёл и способ быстро сконвертировать из YUYV в RGB в буфере в памяти до вывода. Делать это ручками - думаю будет медленно => надо опять использовать OpenGL или ещё кого-то там. Главное, чтобы под Linux эта библиотека была (если не OpenGL, который уж точно тут есть).
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог