Ähnlichkeit zweier Bilder errechnen
-
Per GL_RGB erhalte ich exakt drei Werte pro Pixel, das habe ich eig. beachtet.
Unabhängig davon, ob sie Grün, Rot oder Blau angeben, packe ich alle in einen vektor. Die einzelnen Elemente von diesem Vektor vergleiche ich dann mit dem entsprechenden Vektor des anderen Bilds. Beim Debuggen zeigt sich auch jedes mal dass die beiden gleich groß sind.Mir fällt nichts mehr ein^^
-
Dann hab ich doch noch mal eine Frage: Welchen Grund kann es dafür geben, dass glReadPixels mir verschiedene Werte liefert, wenn ich stehts die selbe stelle auslese? Kann es "Messfehler" geben?
Boindil
-
Nein, das ist ja keine Messung :p.
glReadPixels liefert dir immer den Bildschirminhalt. Ob du 3 oder 4 Werte pro int bekommst, hängt von GL_RGB oder GL_RGBA als parameter ab. GL_RGBA funktioniert auch nur, wenn du einen entsprechenden OpenGL Kontext hast. Kommt halt auch drauf an was gerendert wird. Wenn du kein statisches Bild hast, dürften die Ergbnisse logischerweise abweichen. Ansonsten könnte Antialiasing hier auch ein Grund sein.
-
Erstmal gilt es hier Klarheit zu schaffen:
Boindil schrieb:
Auf dem Bildschirm ist ein rotes Rechteck mit linker unterer Ecke bei -5|1 .
glReadPixels( -5, 1, img.width, img.height, GL_RGB, GL_FLOAT, &Original_data[0]);
Mir ist nicht ganz klar, wie etwas an Position -5,1 sein kann (verwechsel das nicht mit object-Space-coordinates oder dergleichen).
Untere linke Ecke ist 0,0.
-
Um der Sache mit glReadPixels auf den Grund zu gehen, hab ich mir jetzt mal ein kleines Quadrat an der Position des Cursors anzeigen lassen, dass die Farbe hat, die glReadPixels an der Position ausließt.
Allerdings hat das Quadrat immer die Farbe, die der Hintergrund wegen glClearColor(0, 0, 0.2f, 0.5f) hat. glReadPixels gibt mir diese Farbe zurück, obwohl noch andere Objekte über dem Hintergrund gezeichnet werden.
-
Zur Veranschaulichung hier einmal der entsprechende Code. Es erscheint ein Quadrat an der richtigen Position, hat aber, wie gesagt, die Farbe des Szenenhintergrundes, nicht aber des Dreiecks, dass unter dem Mauszeiger ist.
float speicher[3]; glReadPixels(user.x,user.y,1,1,GL_RGB,GL_FLOAT,&speicher[0]); glBegin(GL_QUADS); glColor3f(speicher[0],speicher[1],speicher[2]); glVertex3f(user.x,user.y,0); glVertex3f(user.x,user.y+1,0); glVertex3f(user.x+1,user.y+1,0); glVertex3f(user.x+1,user.y,0); glEnd();
-
Ich weiss nicht wie du an deine Mauskoordinaten kommst - daher kann ich dir nicht sagen woran es liegt. Allerdings hab ich eine Vermutung.
Falls dein OS Windows ist:
Windows Koordinatensystem hat seinen Ursprung (0,0) in der oberen linken Ecke.
OpenGL (in dem Fall glReadPixel) nimmt die untere linke Ecke.Wenn du jetzt ein Fenster hast, das sagen wir mal 500*500 Pixel gross ist und dein Mauszeiger befindet nach Windows-Koordinaten bei (250,0), also oberer Rand ganz in der Mitte, dann wäre das für Opengl (250,500).
Daher wirst du vermutlich immer den falschen Pixel auslesen
-
Danke, aber auch gerade bemerkt und schon behoben.
-
Falls es jemanden interessiert: Es klappt jetzt und läuft ganz nett, allerdings uuuuuunglaublich langsam durch glReadPixels. Gibt es da evtl. eine schnellere Alternative?
-
glReadPixels ist verdammt langsam, ja.
Du kannst aber das ganze auch auf einen FBO rendern und direkt von dort lesen.