Seite 1 von 1

Speicher wird vollgeladen

Verfasst: 12. Juli 2012 04:25
von js
Abend,

Habe in einem Thread eine Schleife laufen lassen um frame für frame ein video im Graphics View Widget anzeigen zu lassen.
Läuft alles so weit, jedoch wird mein speicher vollgeladen und ich wei0 nicht warum.
Wenn ich
scene->addPixmap(QPixmap::fromImage(ConvertImage(image)));
ausklammere dann wird kein bild angezeigt aber auch der Speicher bleibt stabil. Also denke ich mal es liebt an der Konvertierung.

Code: Alles auswählen

void GUI::set_imageone(IplImage *image){

	QGraphicsScene *scene = new QGraphicsScene(); // Grafikszene
    scene->setBackgroundBrush(QColor(0, 0, 0)); // Schwarzer Hintergrund
    scene->addPixmap(QPixmap::fromImage(ConvertImage(image)));  // Bild in QImage konvertieren

	ui.graphicsView->setScene(scene); // Szene anzeigen
	image_cols=image->height;
	image_rows=image->width;

}

Code: Alles auswählen

QImage ConvertImage(IplImage *source)
{
QImage dummy;

    if ( source->depth != IPL_DEPTH_8U || source->nChannels != 3 )
        return dummy;

    // Bilddaten übernehmen
    unsigned char * data = ( unsigned char * ) source->imageData;

    // QImage mit Originaldaten erstellen
    QImage ret( data, source->width, source->height, QImage::Format_RGB888 );
    // Kanäle (BGR -> RGB) und Format (RGB888 -> RGB32) ändern

    return ret.rgbSwapped().convertToFormat( QImage::Format_RGB32 );
	
}
lg

Re: Speicher wird vollgeladen

Verfasst: 12. Juli 2012 11:15
von franzf
IplImage hört sich nach OpenCV an.
Ich denke auch, der Schuldige ist nicht addPixmap, sondern die ganze set_imageone-Funktion.
Du erzeugst immer weitere, neue scenes, ohne die alte zu löschen. Warum überhaupt? Arbeite mit nur einer scene, merk dir das PixmapItem und setz nur da das neue Image.

Re: Speicher wird vollgeladen

Verfasst: 12. Juli 2012 14:19
von js
Hi, habe deinen Ratschlag befolg

Code: Alles auswählen

GUI::GUI(QWidget *parent, Qt::WFlags flags)
	: QMainWindow(parent, flags)
{
...
scene = new QGraphicsScene(); // Grafikszene
scene->setBackgroundBrush(QColor(0, 0, 0)); // Schwarzer Hintergrund

}
und QGraphicsScene *scene in der Klasse dekl.

Code: Alles auswählen

void GUI::set_imageone(IplImage *image){

    scene->addPixmap(QPixmap::fromImage(ConvertImage(image)));  // Bild in QImage konvertieren
	ui.graphicsView->setScene(scene); // Szene anzeigen
	
}

hat leider nichts gebracht.
Aber wenn ich ganz am ende scene->clear() ausführe dann wird kein bild angezeigt aber auch der speicher bleibt konstant. ne idee ?

Re: Speicher wird vollgeladen

Verfasst: 12. Juli 2012 15:13
von franzf
QGraphicsScene::addPixmap() gibt ein QPixmapItem* zurück, DAS speicherst du dir, und auf dem rufst du dann setPixmap() auf.
Dass ein clear() am Ende alles löscht ist klar. Dass ohne clear() ständig neue Pixmaps in die scene gelegt werden, ohne die alten zu löschen, ist auch klar (wenn man sich mal die Doku durchliest).

Re: Speicher wird vollgeladen

Verfasst: 12. Juli 2012 16:03
von js
hast du es so gemeint
?

Code: Alles auswählen

void GUI::set_imageone(IplImage *image){
    scene->setBackgroundBrush(QColor(0, 0, 0)); // Schwarzer Hintergrund
	
    pix=scene->addPixmap(QPixmap::fromImage(ConvertImage(image)));  
    pix->setPixmap(QPixmap::fromImage(ConvertImage(image)));
    ui.graphicsView->setScene(scene); 
}
sry ich habe alles mögliche versucht aber ich kriege es nicht gebacken, ich denke ich müsste noch delete pix; einbauen ....

Re: Speicher wird vollgeladen

Verfasst: 12. Juli 2012 18:58
von js
oder war die idee dachinter das der zeiger auf NULL gesetzt wird ?

Code: Alles auswählen

    pix=scene->addPixmap(QPixmap::fromImage(ConvertImage(image)));  // Bild in QImage konvertieren
	pix->setPixmap(NULL);

Re: Speicher wird vollgeladen

Verfasst: 12. Juli 2012 19:56
von abho
ich glaub gemeint ist, dass du nur einmal ein QGraphicsPixmapItem erstellst und zur Scene hinzufügst.
Dieses item speicherst du dir dann als membervariable und dann jedes mal wenn du ein neues Pixmap anzeigen willst, rufst du nur QGraphicsPixmapItem::setPixmap ( const QPixmap & pixmap ) auf.

Sowas in der Art:

Code: Alles auswählen

GUI::GUI(QWidget *parent, Qt::WFlags flags)
   : QMainWindow(parent, flags)
{
...
scene = new QGraphicsScene(); // Grafikszene
scene->setBackgroundBrush(QColor(0, 0, 0)); // Schwarzer Hintergrund
ui.graphicsView->setScene(scene); 

mPixmapItem = new QGraphicsPixmapItem; // mPixmapItem ist hier eine Membervariable, damit wir später wieder draufzugreifen können

scene->addItem(mPixmapItem); 
}

void GUI::set_imageone(IplImage *image){   
mPixmapItem->setPixmap(QPixmap::fromImage(ConvertImage(image)));
}


Re: Speicher wird vollgeladen

Verfasst: 12. Juli 2012 20:04
von js
@abho

danke danke danke , ich falle auf die Knie vor dir ...........