Speicher wird vollgeladen

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
js
Beiträge: 59
Registriert: 4. Juli 2011 21:29

Speicher wird vollgeladen

Beitrag 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
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: Speicher wird vollgeladen

Beitrag 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.
js
Beiträge: 59
Registriert: 4. Juli 2011 21:29

Re: Speicher wird vollgeladen

Beitrag 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 ?
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: Speicher wird vollgeladen

Beitrag 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).
js
Beiträge: 59
Registriert: 4. Juli 2011 21:29

Re: Speicher wird vollgeladen

Beitrag 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 ....
js
Beiträge: 59
Registriert: 4. Juli 2011 21:29

Re: Speicher wird vollgeladen

Beitrag 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);
abho
Beiträge: 2
Registriert: 7. März 2010 08:10

Re: Speicher wird vollgeladen

Beitrag 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)));
}

js
Beiträge: 59
Registriert: 4. Juli 2011 21:29

Re: Speicher wird vollgeladen

Beitrag von js »

@abho

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