LINUX.ORG.RU

OpenGL: просмотр JPEG


0

2

Доброго дня! Необходимо с Ip-камеры просматривать изображения в JPEG формате, ранее использовал QPixmap с выводом в Qlabel, но из за утечек памяти решил перейти на OpenGL. Использую Qt 4.7.
Изображение с камеры нормально получается, проверял сохраняя в файл, сейчас проблема с выводом средствами OpenGL.
initializeGL()

glClearColor(0.0, 0.0, 0.0, 0.0);
glGenTextures(1, &texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
resizeGL(int width, int height)
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texture);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
image = convert_to_GL(jpg);
if (1 == frame_number)
	glTexImage2D(GL_TEXTURE_2D, 0, 3, width, height, 0,
				 GL_RGBA, GL_UNSIGNED_BYTE, image.bits());
else
	glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height,
					GL_RGBA, GL_UNSIGNED_BYTE, image.bits());
glDisable(GL_TEXTURE_2D);
glPixelZoom(1, 1);
glViewport(0, 0, width, height);
paintGL()
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texture);
glBegin(GL_QUADS);
glTexCoord2f(0.0, 1.0);
glVertex3f(0.0, image.height(), 0.0);
glTexCoord2f(0.0, 0.0);
glVertex3f(0.0, 0.0, 0.0);
glTexCoord2f(1.0, 0.0);
glVertex3f(image.width(), 0.0, 0.0);
glTexCoord2f(1.0, 1.0);
glVertex3f(image.width(), image.height(), 0.0);
glEnd();
glDisable(GL_TEXTURE_2D);
//glDrawPixels(image.width(), image.height(), GL_RGBA,
	//		 GL_UNSIGNED_BYTE, image.bits());
convert_to_GL(const QByteArray &data)
return QGLWidget::convertToGLFormat(QImage::fromData(data));
Проблемы на данный момент:
- при закомментированном glDrawPixels отображается чёрный квадрат с белым квадратом в верхнем правом углу
- при использовании glDrawPixels изображается статическое изображение Выяснено, что:
if (1 == frame_number)
	glTexImage2D(GL_TEXTURE_2D, 0, 3, width, height, 0,
				 GL_RGBA, GL_UNSIGNED_BYTE, image.bits());
else
	glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height,
					GL_RGBA, GL_UNSIGNED_BYTE, image.bits());
glTexSubImage2D всегда заканчивается ошибкой invalid value, при использовании только одной из этих функций ошибки нет, но изображение всё равно не появляется.
Можете подсказать в чём проблема?
Спасибо.

★★

> ранее использовал QPixmap с выводом в Qlabel, но из за утечек памяти

Покажи свой старый код с QPixmap.

anonymous
()

> glTexSubImage2D всегда заканчивается ошибкой invalid value

А для текстуры был предварительно задан размер (например, тем же glTexImage2D)?

Deleted
()

А факт использование OGL тебя должен спасти от утечек?!

erfea ★★★★★
()
Ответ на: комментарий от mi_estas

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

У меня есть подозрение, что не работает он из-за функции convertToGLFormat. Хотя, не буду лезть...

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

> А чему там еще течь-то?

Дырявым иксам? Дырявому блобу для видеокарты?

Вот тебе аналогичная ситуация:
http://developer.qt.nokia.com/forums/viewthread/146
Попробуй мне ответить на вопрос «why there is no problem if I have a dedicated graphics card?»

anonymous
()
Ответ на: комментарий от anonymous

Дырявым иксам? Дырявому блобу для видеокарты?

Т.е. в openGL не течет, а в Qt течет???

И вообще, не надо от темы отходить. А тема была про openGL, а не культи.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

> Т.е. в openGL не течет, а в Qt течет???
«То есть»? Может ты хотел сказать «почему»?

в openGL не течет

А почему оно должно? Я что-то не вижу в коде ТСа иксовых функций. Если изображение не хранится в иксах, как в случае QPixmap, то иксы как бы и не причем.
Заметь, там по ссылке выше пишут, что с QImage, который хранит данные на стороне клиента, нет утечек. О чем это тебе говорит? О том, что Qt течет?

И вообще, не надо от темы отходить. А тема была про openGL, а не культи.

Именно эта? Да, пожалуй, но изначально тема была про Qt, хоть и не на этом форуме. Я же всего лишь исправляю твои ошибки. Кто-то должен же.


anonymous
()
Ответ на: комментарий от Eddy_Em

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

mi_estas
()
Ответ на: комментарий от Eddy_Em

Почему ни у кого они не протекают а у него протекали? Чую, что дело было не в qt.

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

Reset ★★★★★
()
Ответ на: комментарий от webhamster

Проверь просмотр на тестовой картинке:

http://lurkmore.ru/Файл:Sovposter11.jpg

Поведение такое же:
- при неиспользовании glDrawPixels чёрный квадрат с белой верхней правой четвертью
- при использовании картинка видна

imb ★★
() автор топика

А вы тип проекции не забыли указать? Например,

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glViewport(0, 0, W, H);
glOrtho(-W,W, -H,H, -1., 1.);  // <<=== тип проекции
glMatrixMode(GL_MODELVIEW);
Это надо делать в функции initializeGL()

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Нет не указывал, но тут возникает такой вопрос - если инициализация вызывается один раз до отображения данных, то как я указать там параметры изрбражения (высота и ширина) если они мне ещё не известны?

imb ★★
() автор топика
Ответ на: комментарий от imb

Сначала получаете параметры изображения, а затем уже инициализируете. Можно воткнуть эти функции в resize, а можно и в redraw.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Еще вариант (resize):

	glViewport(0, 0, width, height);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluPerspective(45., W/H, 0., 100.0);
	gluLookAt(0., 0., H1, 0., 0., 0., 0., 1., 0.);
	glMatrixMode(GL_MODELVIEW);

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от imb

Мда, пока удалось достичь только чёрного или белого прямоугольника. Если чёрный прямоугольник - это не попавшая текстура, то что такое белый прямоугольник?

imb ★★
() автор топика
Ответ на: комментарий от imb

Если ваш базовый цвет - белый, то белый прямоугольник - и есть ваша картинка, на которой почему-то не отображается текстура.

Eddy_Em ☆☆☆☆☆
()

Посмотрите мой Simple Viewer GL - window.cpp и quad.cpp

andreyu ★★★★★
()
Ответ на: комментарий от imb

Ну что вы мучаетесь с этими текстурами? Коль взялись за OpenGL, используйте DevIL, он же LibIL, он же OpenIL

http://linux.softpedia.com/get/Programming/Libraries/DevIL-35628.shtml

В пакетных менеджерах эта либа называется libdevil.

Developer's Image Library (DevIL) — инструментарий для программиста, который позволяет читать, сохранять и выполнять преобразования между различными форматами изображений. Также он предлагает базовые функции для обработки и фильтрации.

DevIL представляет собой простой программный интерфейс, похожий на OpenGL, лёгок в изучении и использовании разработчиком. Полное управление обработкой изображений остаётся за разработчиком.

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

webhamster
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.