OpenGL: просмотр JPEG



  • Доброго дня!
    Необходимо с Ip-камеры просматривать изображения в JPEG формате, использую 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 =QGLWidget::convertToGLFormat(QImage::fromData(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);
    glTranslatef(-image.width()/2, -image.height()/2, 0.0);
    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());
    show();@
    Проблема следующая:

    при закомментированном glDrawPixels отображается белый прямоугольник

    при использовании glDrawPixels изображается статическое изображение

    При использовании Qt-функций:
    initializeGL()
    @qglClearColor(Qt::black);@
    resizeGL(int width, int height)
    @texture = bindTexture(QImage::fromData(jpg));@
    paintGL()
    @drawTexture(QRectF(-frame_resolution.width()/2,
    -frame_resolution.height()/2,
    frame_resolution.width(),
    frame_resolution.height()),
    texture);
    show();@
    Проблема - отображается прямоугольник тёмносерого цвета

    Вопрос - как правильно выводить на экран JPG используя OpenGL?
    Спасибо.



  • я боюсь что этот вопрос скорее про OpenGL. от Qt тут мало :)
    Почему не рассматривался вариант QGraphicsView на OpenGL и прямоугольником с текстурой с этим изображением? По производительности достаточно шустро



  • Я сделал вариант с отрисовкой через QPainter
    @QPainter paint(this);
    paint.drawImage(0, 0, QImage::fromData(jpg));
    show()@
    Но этот вариант кажется мне не очень стабильным, да и хочется добиться максимальной производительности, я получал следующие значения:

    QPushButton - 12 FPS

    QLabel - 18 FPS

    QPainter - 24 FPS

    OpenGL - 30 FPS

    От QLabel был вынужден отказаться из того, что Xorg "съедал" всю доступную память.
    Где можно увидеть пример применения QGraphicsView применительно к моему случаю, так как я только начинаю использовать Qt и ещё совсем не ориентируюсь в нём?
    Спасибо.



  • В ассистанте :) Еще где-то в лабсах видел пост (года так 2 или 3 назад) про то, как подключить OpenGL к QGV, правда может сейчас все и проще уже стало (я сам это делал года так 2 назад)



  • Как пример можете посмотреть Painter->SVG Viewer. В этом примере как раз используется OpenGL & QGraphicsView.

    Update: в меню "Render" можно переключать способ отрисовки.



  • Меня смущает то, что там применяется QPixmap. Я ранее использовал QPixmap для отрисовки на QLabel/QPushButton и при этом Xorg "съедал" всю память, приложение завершалось с сообщением Killed, а память освобождалась только после завершения приложения.



  • Есть такая странность:
    @QByteArray jpg
    bindTexture(QImage::fromData(jpg))@
    В результате отображается тёмносерый прямоугольник.
    @bindTexture(QImage("/tmp/test.jpg"))@
    Отображается коричнево-сиреневый прямоугольник.
    @bindTexture(QString("/tmp/test.jpg"))@
    Отображается белый прямоугольник.
    Я ещё могу понять разницу между захватом текстуры из памяти и файла, но разница при захвате из файла совершенно не понятна.


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.