Russian Qt Forum
Ноябрь 02, 2024, 06:24 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Быстрая отрисовка изображений с камер 1600x1200  (Прочитано 11132 раз)
artall64
Гость
« : Март 26, 2010, 08:27 »

Здравсвуйте!
Пишу приложение работающее с двумя IP камерами.
Реализовал, потоки приёма, декодирования(из JPEG), обработки, форму GUI.

При этом отрисовка сделана, следующим образом:
Поток обработки загружает сырые данные в QPixmap, и высылает сигнал (QPixmap* img1,QPixmap*img2) в объект формы через Qt::BlockingQueuedConnection
Слот приёма масштабирует Pixmap под размеры QLabel на форме, предназначенного для отрисовки, далее QLabel::setPixmap.

Вопрос насколько корректна такая реализация, в случае если необходимо достичь наиболее быстрой отрисовки(25 fps) из сырых данных ?
Лучше ли будет использовать QGLWidget, или попробовать встроить SDL ?
Приложение ориентировано на Windows. Есть ли смысл и возможность встроить DirectX для отрисовки ?
Возможна какая либо более быстрая отрисовка, с прямым использованием win api в Qt приложении ?
В общем в какую сторону смотреть ?
Записан
Akaiten
Гость
« Ответ #1 : Март 26, 2010, 09:20 »

А какова скорость отрисовки для текущей реализации?
Записан
ieroglif
Гость
« Ответ #2 : Март 26, 2010, 09:24 »

немного не понял - почему готовая картинка запихивается  в QLabel?
попробуй сделай свой собственный виджет и отрисовывай в нём на его paintEvent.. можно ещё отпихнуть это в отдельный поток что бы не торзмозила основная программа.
не уверен, но мне кажется что это быстрее будет..
кроме того надо посмотреть где медленная точка - именно в отрисовывании или где-то раньше.
может вообще имеет смысл писать картинки в видео поток и его отображать через "плеер"?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #3 : Март 26, 2010, 11:45 »

Цитировать
Поток обработки загружает сырые данные в QPixmap, и высылает сигнал (QPixmap* img1,QPixmap*img2) в объект формы через Qt::BlockingQueuedConnection
Слот приёма масштабирует Pixmap под размеры QLabel на форме, предназначенного для отрисовки, далее QLabel::setPixmap.
В корне неправильный подход.
Qt любые трансформации изображения делает только через QImage.
Т.е. у вас сначала создается QImage, который вы потом перегоняете в QPixmap в GDI, потом этот QPixmap из GDI перегоняется в QImage, масштабируется и опять перегоняется в QPixmap в GDI. И имейте в виду, что Qt для double buffering держит ещё один QPixmap размером в top-level окно.  В итоге получается довольно-таки не хилый трафик.
Предлагаю просто отказаться от QPixmap, использовать вместо него QImage и уже в paintEvent() через QPainter::drawImage() отрисовывать результирующее изображение.
Ежели после этого скорость не будет устраивать, то наверное стоит смотреть в сторону DirectX.
Записан

Qt 5.11/4.8.7 (X11/Win)
artall64
Гость
« Ответ #4 : Март 26, 2010, 19:18 »

А какова скорость отрисовки для текущей реализации?
Итоговая скорость отрисовки для двух изображений 6-7 fps.

немного не понял - почему готовая картинка запихивается  в QLabel?
попробуй сделай свой собственный виджет и отрисовывай в нём на его paintEvent.. можно ещё отпихнуть это в отдельный поток что бы не торзмозила основная программа.
не уверен, но мне кажется что это быстрее будет..
кроме того надо посмотреть где медленная точка - именно в отрисовывании или где-то раньше.
может вообще имеет смысл писать картинки в видео поток и его отображать через "плеер"?
Внимательно промерил критические участки кода, проблема действительно не в отрисовке
Критический участок 130-230 ms загрузка из сырых данных - вызов метода  QPixmap::loadFromData( const uchar * data, uint len, "bmp" )
Масштабирование + Отрисовка (в моем понимании вызов QLabel::setPixmap( const QPixmap & ) поправьте если не так )
занимает для двух изображений только 30 - 50 ms.
QLabel использовал в силу собственной глупости  Грустный

Цитировать
Поток обработки загружает сырые данные в QPixmap, и высылает сигнал (QPixmap* img1,QPixmap*img2) в объект формы через Qt::BlockingQueuedConnection
Слот приёма масштабирует Pixmap под размеры QLabel на форме, предназначенного для отрисовки, далее QLabel::setPixmap.
В корне неправильный подход.
Qt любые трансформации изображения делает только через QImage.
Т.е. у вас сначала создается QImage, который вы потом перегоняете в QPixmap в GDI, потом этот QPixmap из GDI перегоняется в QImage, масштабируется и опять перегоняется в QPixmap в GDI. И имейте в виду, что Qt для double buffering держит ещё один QPixmap размером в top-level окно.  В итоге получается довольно-таки не хилый трафик.
Предлагаю просто отказаться от QPixmap, использовать вместо него QImage и уже в paintEvent() через QPainter::drawImage() отрисовывать результирующее изображение.
Ежели после этого скорость не будет устраивать, то наверное стоит смотреть в сторону DirectX.
Большое спасибо!!! сделаю данную реализацию.

Единственное, беспокоит следующий вопрос:
Планирую использовать QImage::loadFromData ( const uchar * data, int len, "bmp" )
думаю время выполнения будет сравнимо с 130-230 ms для QPixmap::loadFromData( const uchar * data, int len, "bmp" ) см.выше
Из за того, что, как предполагаю, при вызове протормаживает на выделении памяти под новое изображение.
Обязательно проверю, попробую глянуть сорцы. Но хотел бы спросить:
Какой наиболее быстрый способ загрузить QImage из сырых данных ?
т.е. как я понимаю, избежать операции выделения в памяти, использовав раннее выделенный участок в объекте QImage.
P.S. или я, что то перемудрил Улыбающийся поправьте Подмигивающий
« Последнее редактирование: Март 26, 2010, 19:22 от artall64 » Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #5 : Март 26, 2010, 19:26 »


Код
C++ (Qt)
 
       QImage img;
 
QBuffer b;
b.setData( data, len );
b.open( QIODevice::ReadOnly );
 
       QImageReader ir( &b, "bmp" );
 
       ir.read ( &img );
 
 
« Последнее редактирование: Март 26, 2010, 19:38 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
artall64
Гость
« Ответ #6 : Март 26, 2010, 19:44 »


Код
C++ (Qt)
 
       QImage img;
 
QBuffer b;
b.setData( data, len );
b.open( QIODevice::ReadOnly );
 
       QImageReader ir( &b, "bmp" );
 
       ir.read ( &img );
 
 

Ок  Подмигивающий Большое спасибо, а то я уже хотел пробовать создавать QIODevice, записывать через write, потом в конструктор QImageReader.
Записан
_govorilka
Гость
« Ответ #7 : Март 29, 2010, 08:26 »

У меня сейчас похожий проект. Для загрузки RAW данных с камеры использую:

Код:
QImage::QImage ( uchar * data, int width, int height, Format format )

при использование этого конструктора QImage не создает нового буфера для хранения данных и не управляет им (не удаляет его в деструкторе).
Записан
artall64
Гость
« Ответ #8 : Апрель 14, 2010, 11:33 »

Вобщем, укзанные пероприятия особого прироста в скорости не дали.
В т.ч. использование QImageLoader для RAW изображения 1600х1200 + BMP заоловок занимает от 30 до 80 мс, также как конструктор QImage ( uchar * data, int width, int height, Format format ).

Проблему решил напрямую используя GDI при отрисовке своего виджета, загрузка + отрисовка + маштабирование 5-10 мс, + значительно снизилась нагрузка на ЦП.

Всем спасибо!
Записан
psgenn
Гость
« Ответ #9 : Март 29, 2011, 18:43 »

Проблему решил напрямую используя GDI при отрисовке своего виджета, загрузка + отрисовка + маштабирование 5-10 мс, + значительно снизилась нагрузка на ЦП.
А можно по подробнее.
Записан
panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 864

Акцио ЗАРПЛАТА!!!!! :(


Просмотр профиля
« Ответ #10 : Март 29, 2011, 23:05 »

Проблему решил напрямую используя GDI при отрисовке своего виджета, загрузка + отрисовка + маштабирование 5-10 мс, + значительно снизилась нагрузка на ЦП.
не вылетает?
с винапой надо поосторожнее работать...
Записан

Win Xp SP-2, Qt4.3.4/MinGW. http://trdm.1gb.ru/
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.094 секунд. Запросов: 22.