OpenCV-Image wird für OpenGL-Textur geladen

8

Ich möchte ein Bild (jpg und png) mit OpenCV als OpenGL Texture laden.

So lade ich das Bild in OpenGL:

%Vor%

Das Bild wird geladen, da "image.empty" immer false

zurückgibt

So rendere ich die Szene mit der erstellten Textur:

%Vor%

Und schließlich der fragmentShader, wo ich die Textur auf meine Geometrie anwenden möchte

%Vor%

Die Texturkoordinaten stammen aus einem Vertex-Buffer-Objekt und werden korrekt aus der OBJ-Datei gesetzt. Außerdem kann ich das Objekt in meiner Szene sehen, wenn ich die Farbe z. rot im Fragment-Shader oder vec4 (tCoord, 0,1); dann wird das Objekt in einer anderen Farbe schattiert.

Leider bleibt der Bildschirm schwarz, wenn ich die Textur anwenden möchte ... Kann mir jemand helfen und mir sagen, warum bleibt schwarz?

    
glethien 29.05.2013, 09:10
quelle

2 Antworten

16

Wenn Sie sich nur den Texture Loading Code ansehen, ignorieren Sie viele Überlegungen darüber, wie OpenCV Bilder im Speicher auslegt. Ich habe dies bereits in der Antwort für die umgekehrte Richtung ( glGetTexImage in OpenCV-Bild) erklärt, werde es aber noch einmal rekapitulieren hier für die CV-GL-Richtung:

Zuallererst speichert OpenCV nicht unbedingt Bildreihen, die dicht gepackt sind, sondern könnte sie an bestimmte Bytegrenzen ausrichten (weiß nicht wie viel, mindestens 4, aber vielleicht 8 oder mehr?). Wenn Sie Glück haben, wird die 4-Byte-Ausrichtung verwendet und der GL wird ebenfalls auf den Standard-Pixelspeichermodus der 4-Byte-Ausrichtung eingestellt. Aber es ist am besten, manuell mit den Pixelspeichermodi zu spielen, um auf der sicheren Seite zu sein:

%Vor%

Dann müssen Sie berücksichtigen, dass OpenCV Bilder von oben nach unten speichert, während der GL von unten nach oben arbeitet. Man könnte dafür sorgen, dass die t-Textur-Koordinate entsprechend gespiegelt wird (möglicherweise direkt im Shader), aber Sie können das Bild auch einfach vor dem Hochladen spiegeln:

%Vor%

Zu guter Letzt speichert OpenCV Farbbilder im BGR-Format, so dass das Hochladen als RGB die Farben verzerrt. Verwenden Sie also GL_BGR (erfordert OpenGL 1.2, aber wer hat das nicht?) In glTexImage2D .

Dies ist möglicherweise nicht die vollständige Lösung für Ihr Problem (da ich denke, dass diese Fehler eher zu einem verzerrten als zu einem schwarzen Bild führen sollten), aber es sind definitiv Probleme, auf die Sie achten müssen.

BEARBEITEN: Wird Ihr Fragment-Shader tatsächlich erfolgreich kompiliert (in der vollständigen Version mit der Textur)? Ich frage, weil in der GLSL 3.30 Sie das Wort texture verwenden, ist auch der Name einer eingebauten Funktion (die eigentlich anstelle der veralteten texture2D -Funktion verwendet werden sollte), vielleicht hat der Compiler also eine Namensauflösung Probleme (und vielleicht wird dieser Fehler in Ihren vereinfachten Shadern ignoriert, da die gesamte Uniform weg optimiert wird und viele GLSL-Compiler bekanntermaßen alles andere als streng genormt sind). Versuchen Sie also, dem Sampler einen anderen Namen zu geben.

    
Christian Rau 29.05.2013, 11:20
quelle
8

Okay, hier ist meine Arbeitslösung - basierend auf den Ideen von "Christan Rau" - Danke dafür!

%Vor%     
glethien 29.05.2013 13:46
quelle

Tags und Links