Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: ¤Se®ega¤ от Апрель 19, 2009, 14:01



Название: Как быстро сохранить изображение большого размера?
Отправлено: ¤Se®ega¤ от Апрель 19, 2009, 14:01
есть объек класса QPixmap с размерами (2500,2000), на котором я рисую какие-то кракозябры с высокой частотой(50-60 fps),потом этот объект я сохраняю в буфер (buffer->open(QIODevice::WriteOnly);pixmap->save(buffer, "PNG");).Частота сохранения изображения в буфеп порядка 1 fps. Как мне ускорить этот процесс?(картинка рисуется на сервера и передается клиентом чрес сокет).


Название: Re: Как быстро сохранить изображение большого размера?
Отправлено: Rcus от Апрель 19, 2009, 15:04
2500*2000*4 это 2*10^6 байт. Вполне помоему нормальная скорость записи (да я знаю про lossless сжатие).

На мой взгляд вы пытаетесь заново изобрести аналог X11 или RDP.


Название: Re: Как быстро сохранить изображение большого размера?
Отправлено: ¤Se®ega¤ от Апрель 19, 2009, 18:04
Тоесть это вполне нормально?Просто от меня требуют чтобы частота соранения была тоже порядка 50 раз в секунду, я подумал, может я че не так делаю.Может использовать другой формат?


Название: Re: Как быстро сохранить изображение большого размера?
Отправлено: Rcus от Апрель 19, 2009, 18:29
Ну посмотрите как реализованы X Windows System и RDP, там идет передача не изображений, а команд соответственно X11 и GDI. Правда все равно 50 fps... К чему такие сложности, зачем вообще нужно создавать проблемы с передачей изображений по сети и затем с ними бороться?


Название: Re: Как быстро сохранить изображение большого размера?
Отправлено: SABROG от Апрель 21, 2009, 09:10
Я например не понял такой момент. По сокету передается несжатый QPixmap, затем сервер его его пожимает в PNG?
Если так, то выход я вижу в следующем:
- на сервер передается размер картинки и её параметры
- вместо того, чтобы передавать картинку целиком - на сервер передаются команды рисования мышкой. Кликнул по какому-то пикселю - через сокет передался индекс пикселя и цвет. Можно сделать небольшой буффер, который будет отправляться после того как заполнится необходимым количеством действий.
Если не хочется нагружать сервер, то передавать только QRect измененной области (как diff в svn/cvs/git), предварительно пожав его через qCompress.


Название: Re: Как быстро сохранить изображение большого размера?
Отправлено: spirit от Апрель 21, 2009, 09:23
qCompress достаточно медленно работает.


Название: Re: Как быстро сохранить изображение большого размера?
Отправлено: ¤Se®ega¤ от Апрель 21, 2009, 10:05
Мне надо передавать именно картинку, большого размера, с частотой 50 раз в секунду.


Название: Re: Как быстро сохранить изображение большого размера?
Отправлено: spirit от Апрель 21, 2009, 10:14
не знаю на сколько это будет производительно,
но что если насобирать 50 картинок и потом раз в секунду их отсылать,
а уже на стороне клиент их показывать по очереди.


Название: Re: Как быстро сохранить изображение большого размера?
Отправлено: Rcus от Апрель 21, 2009, 10:23
/*думает что скоро обсуждение дойдет до кодирования видеопотока*/


Название: Re: Как быстро сохранить изображение большого размера?
Отправлено: spirit от Апрель 21, 2009, 10:26
/*думает что скоро обсуждение дойдет до кодирования видеопотока*/
+1  ;D


Название: Re: Как быстро сохранить изображение большого размера?
Отправлено: ¤Se®ega¤ от Апрель 21, 2009, 10:47
можно и так, но вся проблема на данном этапе заключается именно в том, что при сохранении картинки проходит много времени( 1 секунда), думаю если в секунду сохранять 50 картинок, то этот интервал увеличится )))и толку не будет.


Название: Re: Как быстро сохранить изображение большого размера?
Отправлено: Rcus от Апрель 21, 2009, 10:52
Тяжело мне, да и, возможно, не только мне, давать советы не зная контекста использования. Может быть вы нам расскажете немного об использовании.


Название: Re: Как быстро сохранить изображение большого размера?
Отправлено: pastor от Апрель 21, 2009, 10:52
А где можно увидеть полный код получения\сохранения\передачи изображения?


Название: Re: Как быстро сохранить изображение большого размера?
Отправлено: spirit от Апрель 21, 2009, 10:53
пробуй уменьшать качество.


Название: Re: Как быстро сохранить изображение большого размера?
Отправлено: SABROG от Апрель 21, 2009, 11:15
А можно подробней о предназначении программы?

А что qCompress будет все-равно медленным, если степень сжатия поставить 1?


Название: Re: Как быстро сохранить изображение большого размера?
Отправлено: spirit от Апрель 21, 2009, 11:27
А что qCompress будет все-равно медленным, если степень сжатия поставить 1?
а толку от него, если png уже пожат?


Название: Re: Как быстро сохранить изображение большого размера?
Отправлено: SABROG от Апрель 21, 2009, 11:36
Я говорю о варианте без сжатия картинки. Посылать через сокет команды вместо картинок. Если рисуют одновременно несколько человек, то задача сервера тупо переслать эти команды всем клиентам, а их клиентские приложения сами будут все рисовать.


Название: Re: Как быстро сохранить изображение большого размера?
Отправлено: spirit от Апрель 21, 2009, 11:37
Я говорю о варианте без сжатия картинки. Посылать через сокет команды вместо картинок. Если рисуют одновременно несколько человек, то задача сервера тупо переслать эти команды всем клиентам, а их клиентские приложения сами будут все рисовать.
ааа, ну тогда есть смысл конечно. не понял сначала.  :)


Название: Re: Как быстро сохранить изображение большого размера?
Отправлено: SABROG от Апрель 21, 2009, 11:56
А вообще 60 картинок (fps) размером 2500x2000 это даже самый оптимизированный видео-кодек быстро не сожмет. Конечно на скорость будет влиять количество разнообразия пикселей. Если создать белую картинку с одним черным пикселем в центре, то операция будет достаточно быстрой. Но когда 10 человек начнут рисовать что-то свое на таком здоровом поле, то скорость упадет очень быстро.


Название: Re: Как быстро сохранить изображение большого размера?
Отправлено: ¤Se®ega¤ от Апрель 21, 2009, 15:07
Формат изображения не обязательно PNG. Размер сегодня уменьшили до  1600*1200.И как вы считаете, если применять методы bits,scanLineбьуьсзн, возможно повысить производительнность?Сейчас важно сгенерированную картинку запихнуть в сокет с частотой 50 fps.'nj сейчас самое слабое место.При сохранении картинки в формате PNG с разрешением 2560*2048 частота была порядка 1 fps, картинку в формате BMP "передавал" в 4-5 раз быстрее.Возможно изменение размера повлияет на частоту, но думаю не в десятки раз.


Название: Re: Как быстро сохранить изображение большого размера?
Отправлено: SABROG от Апрель 21, 2009, 16:29
Я так и не понял предназначения подобной программы. 50 fps человеческий глаз не воспринимает. Оптимально 25-30. А если надо просто видеть как человек линию ведет, то там все 5 fps подойдут, просто видео будет рывками. А к чему такая точность?


Название: Re: Как быстро сохранить изображение большого размера?
Отправлено: Sergeich от Апрель 21, 2009, 18:51
Камрад Серега!
Давай определимся, и не будем множить темы на форуме об одном и том же - у тебя уже штук восемь постов по одной конкретной задаче . Давай, если ты не против, сделаем так:
Ты излагаешь здесь свою задачу: а именно - для чего нужна программа, зачем архитектура клиент-сервер, зачем OpenGL, зачем передавать по сети 4-х мегапиксельные картинки с FPS = 50?
Если ты это сделаешь - сразу снимется хренова туча вопросов (libastral, к сожалению, собирается не у всех). И, я уверен, на все твои проблемы найдется хоть один, но дельный совет.
Лично я могу дать совет по использованию OpenGL, передачи данных по сети, и кодированию/декодированию видеопотока, но только в том случае, если задача поставлена нормально.


Название: Re: Как быстро сохранить изображение большого размера?
Отправлено: SABROG от Апрель 21, 2009, 22:29
Не знаю как вам, а мне подобная задача напоминает попытку сделать полноэкранную 3d игру типа Call of Duty, только вся работа с граффикой идет не на видео-карте клиента, а на сервере. Что-то типа thin client для игр.


Название: Re: Как быстро сохранить изображение большого размера?
Отправлено: ¤Se®ega¤ от Апрель 21, 2009, 22:54
Прохожу практику на фирме, занимающейся видеонаблюдением.Руководитель, человек неглупый, дал задание: Создать программу, которая сможет отображать КАРТИНКИ размером (уже 1600*1200) с частотой 50 fps ну и в дальнейшем еще и на несольких мониторах разные картинки.Чтобы видеть, что мы картинки в дейцствивельности получаем надо сделать анимацию, например средствами OPenGL, так как это быстро, чтобы получать картинки и не загружать программу их генерацией,можно организовать  клиента и сервера, сервер генерит, клиент получает и отображает.Картинка уже известным рамером отображаем с известной частотой.Теперь что касается необходимости этого "проекта".Возможно в дальнейшем сервр с генерацией будет заменен на поток данных с камер,которые бдут передавать изображения с подобным разрешнием и подобной частотой.


Название: Re: Как быстро сохранить изображение большого размера?
Отправлено: spirit от Апрель 22, 2009, 08:17
значит все-таки видео поток.


Название: Re: Как быстро сохранить изображение большого размера?
Отправлено: SABROG от Апрель 22, 2009, 10:52
Камеры уже в каком-то формате передают видео-поток. По сути ты пытаешься на Qt написать свой алгоритм сжатия этого видео-потока, вместо того, чтобы заняться поиском кроссплатформенного декодера для потока с камеры и проверить насколько хватает пропускной способности сети и мощности компьютера, чтобы передать какой-нибудь сгенеренный фильм в Sony Vegas с подобной частотой и разрешением.


Название: Re: Как быстро сохранить изображение большого размера?
Отправлено: ¤Se®ega¤ от Апрель 22, 2009, 12:30
Какого сжатия? вы о чем? мне надо картинку нарисовать, записать во что-то, это что-то передать, и потом отобразить, все.


Название: Re: Как быстро сохранить изображение большого размера?
Отправлено: SABROG от Апрель 22, 2009, 15:51
Какого сжатия? вы о чем? мне надо картинку нарисовать, записать во что-то, это что-то передать, и потом отобразить, все.

Ага картинку... Если быть точнее, то 50 картинок в секунду с разрешением 1600*1200 по сети и видимо, чтобы не лагало и без задержек. А это уже ну никак не картинка, а видео-поток.

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

Если действительно ограничиваться рамками нарисовать картинку и передать, то какой смысл вообще за это браться, если это изначально неверный подход, который в итоге приведет к тому о чем тебе уже сказали. Лишняя трата времени. Надо подстраиваться под реальную ситуацию, а не под абстрактную. Или создать искусственные условия.
Поставь в сети VLC сервер настрой мультикастинг, сгенери в Sony Vegas или virtualdub видео поток с фрейм-рейтом 50 фпс и разрешением 1600*1200, затем настрой бесконечную прокрутку этого потока в VLC и поставь кодек, аналогичный тому, что стоит в системе видео-наблюдения. Изучи протокол, по которому идет передача видео-потока и начинай дешифровывать его с помощью средств Qt.

Только, если бы я взялся за это, то изначально потребовал бы за программу энную сумму.


Название: Re: Как быстро сохранить изображение большого размера?
Отправлено: ¤Se®ega¤ от Апрель 22, 2009, 19:50
Куда-то все не туда. касеры, видео, суммы.


Название: Re: Как быстро сохранить изображение большого размера?
Отправлено: kamre от Апрель 22, 2009, 20:53
сможет отображать КАРТИНКИ размером (уже 1600*1200) с частотой 50 fps ну и в дальнейшем еще и на несольких мониторах разные картинки.

Нормальный такой поток данных: 1600*1200*3*50 / 2^20 ~ 275 MBytes/sec. Внутри компа такой поток можно гонять довольно просто между CPU/GPU/RAM. Но уже не всякий жесткий диск осилит чтение данных с такой скоростью. По сетке такое гонять далеко не по всякой получится.

Так что надо определиться с задачей. Для видеонаблюдения такой поток какой-то не реальный просто. Но, скажем, создавать картинки с указанной скоростью в одном процессе и отображать в другом процессе на одном и том же компе вполне реально - пример X Window system.


Название: Re: Как быстро сохранить изображение большого размера?
Отправлено: Sergeich от Апрель 22, 2009, 22:49
Прохожу практику на фирме, занимающейся видеонаблюдением.Руководитель, человек неглупый, дал задание: Создать программу, которая сможет отображать КАРТИНКИ размером (уже 1600*1200) с частотой 50 fps ну и в дальнейшем еще и на несольких мониторах разные картинки.Чтобы видеть, что мы картинки в дейцствивельности получаем надо сделать анимацию, например средствами OPenGL, так как это быстро, чтобы получать картинки и не загружать программу их генерацией,можно организовать  клиента и сервера, сервер генерит, клиент получает и отображает.Картинка уже известным рамером отображаем с известной частотой.Теперь что касается необходимости этого "проекта".Возможно в дальнейшем сервр с генерацией будет заменен на поток данных с камер,которые бдут передавать изображения с подобным разрешнием и подобной частотой.
Камрад Серега!
Я сейчас работаю в конторе, которая занимается системами видеонаблюдения, в связи с этим рекомендую узнать у научного руководителя, со скольких мегапиксельных камер он хочет получать поток чтоб 1600х1200 и 50 fps.
По поводу твоей конкретной задачи: для эмулирования видеопотока сеть вообще не нужна, сделай картинку в QImage  и что-нить на ней двигай - этого  достаточно. OpenGL здесь нафиг не нужен - его вообще разумно применять только тогда когда нужен рендеринг трехмерных сцен.


Название: Re: Как быстро сохранить изображение большого размера?
Отправлено: Sergeich от Апрель 22, 2009, 22:58
Вообще, если у тя практика не типа не на отъебись - рекмендую книгу Яна Ричардсона, при желании, найдешь в djvu, ну или, на озоне купи.


Название: Re: Как быстро сохранить изображение большого размера?
Отправлено: ¤Se®ega¤ от Апрель 23, 2009, 00:11
Как раз мне это надо, мне и самому как-то интересно ) молодой развивающийся )))Спасибо.Проект пока приостановлен в связи с дипломной работой, но тема отнюдь не закрыта, временный перерыв.а там углУбимся и расширимся )))Пока всем спасибо за поддержку ОГРОМНОЕ ))) ;)