Problem Videostream auf QglWidget

Alles rund um die Programmierung mit Qt
Antworten
littlepeoplegirl79
Beiträge: 30
Registriert: 6. September 2004 17:12

Problem Videostream auf QglWidget

Beitrag von littlepeoplegirl79 »

Hallo,

ich möchte ein Videostream auf ein QGLWidget legen.
Jedoch zeigt er mir im Programmablauf nichts an.
Die QGLWidget wird auf ein QWidget gelegt.

im QWidget:

Code: Alles auswählen

GLBox* openglBox;

openglBox = new GLBox( this, "glbox"); //f, "glbox"

.....

//Aufruf:
openglBox->LoadGL( dataPtr /*Videostream*/ );
im QglWidget:

Code: Alles auswählen


void GLBox::initializeGL()
{
    qglClearColor( white );
    glEnable( GL_DEPTH_TEST );
    glClearDepth(1.0f);
    glDepthFunc(GL_LEQUAL);
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
}

....

bool GLBox::LoadGL( unsigned char* pic )	
{
	bool Status = true;					// Status Indicator

	if(pic != NULL)
	{

		glDisable(GL_DEPTH_TEST);
		glColorMask( 1, 1, 1, 1 ); //enable colors rgba
		glDisable(GL_BLEND);// Disable Blending
		glPixelZoom( 1, -1 );
		glRasterPos3i( 320, 240, 0 );
		glDrawPixels( m_grab.GetWidth(), m_grab.GetHeight(), GL_BGRA_EXT, GL_UNSIGNED_BYTE, pic );
		glDisable(GL_BLEND);// Disable Blending
		glEnable(GL_DEPTH_TEST);// Enable Depth Testing
	}
	else
	{
		printf("\nPic can't load for the gl widget!\n");
	}


	return Status;							// Return The Status
}
Pic hat einen gültigen Wert und das Programm durchläuft bei jedem Frame den Aufruf.
Bei der Ausgabe kommt jedoch nur ein weisses Bild?

Kann mir jemand einen Tipp geben in welcher Richtung das Problem liegen könnte, oder wo ich Fehler mache!


Gruß und Dank!
lepsai
Beiträge: 573
Registriert: 14. September 2004 21:33
Wohnort: Berlin
Kontaktdaten:

Beitrag von lepsai »

Ich hab mich vor ein paar Jahren mit OpenGl in der Uni rumschlagen müssen. Da musste ich auch ein Bild im OpenGl Kontext zeichnen und ich glaube, dass es etwas komplexer war, als in deinem Beispiel. Guck dir vielleicht diesen Teil an. Wenn du sagst, dass du nur ein weißes Bild zu sehen bekommst, ist es schon ein gutes Zeichen, da OpenGL anscheinend laüft. Es hätte ja sein können, dass das OpenGL-Overlay gar nicht angezeigt wird...

Sag ma Bescheid, wenn du es zum Laufen gebracht hast...

und ne Frage: Warum muss dein Video in OpenGL-Kontext ausgegeben werden?
littlepeoplegirl79
Beiträge: 30
Registriert: 6. September 2004 17:12

Beitrag von littlepeoplegirl79 »

In dem Video wird ein Objekt getrackt und dessen Position wird an ein OpenGL-Objekt geleitet das sich dann korrekt dort zeichnet.

Läßt sich eigentlich der Hintergrund in OpenGL-Transparent setzen?
Also das ich nur das Objekt zeichne und nichts weiter?
Wenn ja, wie mach ich das?

Gruß und Dank
lepsai
Beiträge: 573
Registriert: 14. September 2004 21:33
Wohnort: Berlin
Kontaktdaten:

Beitrag von lepsai »

lepsai
Beiträge: 573
Registriert: 14. September 2004 21:33
Wohnort: Berlin
Kontaktdaten:

Beitrag von lepsai »

[quote="littlepeoplegirl79"]In dem Video wird ein Objekt getrackt und dessen Position wird an ein OpenGL-Objekt geleitet das sich dann korrekt dort zeichnet.
[/quote]

Du willst also OpenGL dafür benutzen, ein Overlay auf dein Video zu legen. Habe ich das richtig verstanden?
littlepeoplegirl79
Beiträge: 30
Registriert: 6. September 2004 17:12

Beitrag von littlepeoplegirl79 »

Das war mein 2 Ansatz, wenn ich es nur mit OpenGL nicht hinbekomme!

Also ja!
lepsai
Beiträge: 573
Registriert: 14. September 2004 21:33
Wohnort: Berlin
Kontaktdaten:

Beitrag von lepsai »

Dann würde ich das ganz anderes machen.

1) Zeiche dein Videostream in ein QScrollWidget (viewportPaintEvent() ist dann dein Freund :) )

2) nach dem ein Frame gezeichnet wurde kannste in viewportPaintEvent() , auch dein Overlay oder mehere Overlays zeichnen.

Ich würde noch zwei zusätzliche Abstraktionen einführen:

a) MyOverlay - liste aller graphishen Objekte in Vektorform. (Objekte selbst brauchen nix mit Qt zu tun)

b) MyOverlayRenderer - Die Klasse zeichnet ein MyOverlay in ein gegebenes QPainter-Objekt

deine QScrollView könnte dann eine Liste von MyOverlay's verwalten und über MyOverlayRenderer in viewportPaintEvent() zeichnen.

Das ist eine sehr effiziente Methode, die ich in meinen Projekten anwende.

Viel Erfolg!
Antworten