Seite 1 von 1

cvShowImage Fenster aus QT heraus aufrufen [solved]

Verfasst: 22. Januar 2009 12:35
von AndiLatte
Ich habe eine Frage bzgl. OpenCV und QT.
Meine Funktion soll ein einfaches Histogram eines Graubildes erzeugen.
Dies macht es auch und ich kann das Histogram auch per OpenCV Funktion "cvSaveImage" als Bild speichern.

Aber es lässt sich nicht per OpenCV Funktion "cvShowImage" auf dem Bildschirm anzeigen.

Eigentlich sollte ein cvShowImage Fenster aus einer QT Anwendung heraus doch aufrufbar sein, oder?

Code: Alles auswählen

CvHistogram* hist;
IplImage* image= 0;
IplImage* imgHistogram = 0;
IplImage* gray= 0;

void createHistogram() {

image = cvLoadImage("0_image_gray.png",1);
int bins = 256;
int hsize[] = {bins};
float max_value = 0, min_value = 0;
float value;
int normalized;

float xranges[] = { 0, 256 };
float* ranges[] = { xranges };

gray = cvCreateImage( cvGetSize(image), 8, 1 );
cvCvtColor( image, gray, CV_BGR2GRAY );

IplImage* planes[] = { gray };
hist = cvCreateHist( 1, hsize, CV_HIST_ARRAY, ranges,1);
cvCalcHist( planes, hist, 0, NULL);
cvGetMinMaxHistValue( hist, &min_value, &max_value);

imgHistogram = cvCreateImage(cvSize(bins, 50),8,1);
cvRectangle(imgHistogram, cvPoint(0,0), cvPoint(256,50), CV_RGB(255,255,255),-1);

for(int i=0; i < bins; i++) {
	value = cvQueryHistValue_1D( hist, i);
	normalized = cvRound(value * 50 / max_value);
	cvLine(imgHistogram,cvPoint(i,50), cvPoint(i,50-normalized), CV_RGB(0,0,0));
	}

cvNamedWindow("histogram",CV_WINDOW_AUTOSIZE);

// funktioniert nicht !!
cvShowImage( "histogram", imgHistogram );

// funktioniert
cvSaveImage("0_histo.png", imgHistogram);

}
Woran kann es liegen, dass kein Fenster mit Bild via cvShowImage angezeigt wird?

Verfasst: 22. Januar 2009 12:48
von franzf
1) Einrückung ist ...
2) wissen wir leider nicht, was cvShowImage macht, auch den Kontext nicht.
3) Könntest du selbst mal Debug-Meldungen auf die Konsole ausspucken, was grad alles gemacht wird, und so selber wohl schon recht nahe an die Fehlerquelle rankommen
4) schaut das ja alles aus, als würdest du in C Programmieren. Kannst du das nicht irgendwie schön in eine/mehrere Klassen verpacken?

Bisschen mehr Code, zumindest von den relevanten Passagen wäre nicht schlecht...

Grüße
Franz

Verfasst: 22. Januar 2009 13:06
von AndiLatte
franzf hat geschrieben:1) Einrückung ist ...
2) wissen wir leider nicht, was cvShowImage macht, auch den Kontext nicht.
3) Könntest du selbst mal Debug-Meldungen auf die Konsole ausspucken, was grad alles gemacht wird, und so selber wohl schon recht nahe an die Fehlerquelle rankommen
4) schaut das ja alles aus, als würdest du in C Programmieren. Kannst du das nicht irgendwie schön in eine/mehrere Klassen verpacken?

Bisschen mehr Code, zumindest von den relevanten Passagen wäre nicht schlecht...

Grüße
Franz
:roll:

für dich, falls du die relevanten Passagen wirklich nachschlagen möchtest ---> http://opencv.willowgarage.com/wiki/

Verfasst: 22. Januar 2009 13:23
von Volker
Blöde Frage, wozu brauchst Du Qt, wenn Du das Bild mit cvShowImage anzeigen willst?

Ich würde denken, dass man eher versucht das Bild mit Qt anzuzeigen. Im langsamsten aber einfachsten Fall, könntest Du das so lösen, dass Du das Bild erst abspeicherst und anschließend z.B. über ein QLabel wieder anzeigst.

Eine performantere Lösung wäre z.B. über ein QGLWidget das IplImage als Textur anzuzeigen.

Verfasst: 22. Januar 2009 13:39
von AndiLatte
Volker hat geschrieben:Blöde Frage, wozu brauchst Du Qt, wenn Du das Bild mit cvShowImage anzeigen willst?

Ich würde denken, dass man eher versucht das Bild mit Qt anzuzeigen. Im langsamsten aber einfachsten Fall, könntest Du das so lösen, dass Du das Bild erst abspeicherst und anschließend z.B. über ein QLabel wieder anzeigst.

Eine performantere Lösung wäre z.B. über ein QGLWidget das IplImage als Textur anzuzeigen.
Ich habe eine Qt Anwendung zur Bildverarbeitung in der ich auch u.a. OpenGL verwende. Um die Steuerung der Anwendung, OpenGL Anbindung und Bildverarbeitungsalgorithmen zu vereinen habe ich Qt gewählt.

Klar kann ich, dass Bild auch via Qt, über verschiedene Wege, ausgeben. Doch das wäre vielleicht ein Schritt zuviel wenn ich es direkt via OpenCV als Popup auf den Bildschrim ausgeben könnte. Was meine Frage ist.
Schliesslich kann ich es auch via OpenCV auch in diversen Formaten auf die Platte legen.

Verfasst: 22. Januar 2009 13:44
von Volker
Dann bleibt dir wohl nichts anderes übrig, als OpenCV in der Debugvariante zu übersetzen und Step für Step zu debuggen, warum das Fenster nicht erzeugt wird. Ich bilde mir aber ein, dass ich das vor ein paar Jahren schon mal gemacht hätte, also grundsätzlich sollte es schon gehen.

Verfasst: 22. Januar 2009 13:48
von AndiLatte
Volker hat geschrieben:Dann bleibt dir wohl nichts anderes übrig, als OpenCV in der Debugvariante zu übersetzen und Step für Step zu debuggen, warum das Fenster nicht erzeugt wird. Ich bilde mir aber ein, dass ich das vor ein paar Jahren schon mal gemacht hätte, also grundsätzlich sollte es schon gehen.
Habe den Fehler gefunden:

Code: Alles auswählen

cvNamedWindow("histogram",CV_WINDOW_AUTOSIZE);
cvShowImage( "histogram", imgHistogram );
cvWaitKey(0); // <---------------------- fehlte------------

Verfasst: 22. Januar 2009 14:11
von franzf
AndiLatte hat geschrieben:für dich, falls du die relevanten Passagen wirklich nachschlagen möchtest ---> http://opencv.willowgarage.com/wiki/
Ah, danke! Hab als ich die Antwort geschrieben hab nichts von OpenCV in deinem Post gelesen, drum dachte ich es wäre eine eigene Kreation ;)
Aber ist zum Glück eh schon solved!

Grüße
Franz