Texturinformationen auslesen (OpenGL)
-
Hallo Leute!
Ich will mal versuchen einen Detecor für feature points zu schreiben (Soll nur ein Test-Programm werden). Allerdings steh ich noch am Anfang uns es hakt schon

Ich hab mal angefangen und hab ein Quad gerendert, auf das ich eine Textur mappe.
Die Textur wird geladen und auf dem Quad angezeigt.
Jetzt stehe ich vor dem Problem, dass ich nicht weiß, wie ich an die RGB-Werte der einzelnen Pixel ran komme. Höhe und Breite hab ich zur Vefügung und die Daten des Pixels. Aber ich weiß nicht, in welchen Datentyp ich das casten muss, oder wie ich sonst an RGB Werte komme.Der relevante Code sieht folgendermaßen aus:
int LoadGLTextures() // Bitmaps laden und konvertieren { int Status=FALSE; // Status ersteinmal auf FALSE setzen AUX_RGBImageRec *TextureImage[1]; // Speicherplatz für die Textur schaffen //memset(TextureImage,0,sizeof(void *)*1); //Vorher sichergehen das dieser auch leer ist memset(TextureImage,0,sizeof(void *)); //laden der BMP if (TextureImage[0]=LoadBMP("C:\\test.bmp")) { Status=TRUE; glGenTextures(1, &texture[0]); glBindTexture(GL_TEXTURE_2D, texture[0]); glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); } if (TextureImage[0]) { if (TextureImage[0]->data) { //fillUpRGBVector(TextureImage[0]->data); //da soll was passieren... free(TextureImage[0]->data); } free(TextureImage[0]); } return Status; }AUX_RGBImageRec *LoadBMP(char *Filename) { FILE *File=NULL; if (!Filename) return NULL; File=fopen(Filename,"r"); //Datei öffnen if (File) { fclose(File); // Datei schließen return auxDIBImageLoad(Filename); } return NULL; }Jetzt hab ich in "TextureImage[0]->data" die Informationen an die ich ran will (jedenfalls gehe ich davon aus). Ich schätze mal, dass es irgendeinen Datentyp gibt, in den ich casten kann, um die Infos auszulesen.
Kann mir jemand helfen? Ist wahrscheinlich kiein geschickter Weg, aber es soll nur zum testen sein.
Liebe Grüße
mtx
-
Ich kann jetzt für nichts garantieren... Aber laut deinem glTexImage2D-Aufruf sind die Daten im Format R G B (GL_RGB), mit je einem vorzeichenlosem Byte pro Kanal gespeichert (GL_UNSIGNED_BYTE).
Einen Kanal kannst du dann in einem
unsigned char;speichern, einen Pixel in
unsigned char[3];Wie du das dann ausliest wirst du selber herausfinden oder wer anders erklärt es dir
Aber es ist ja im Grunde nur das kopieren eines Speicherbereichs, oder auch das zuweisen von 3 Werten aus einem Array in ein Array.
-
Danke dir!
Irgendwie hat´s jetzt glaub ich "klick" gemacht.
Ich hab´s hinbekommen, denke ich. Jedenfalls hab ich nen (vermutlich unglaublich ineffizienten) vector<vector<vector<int>>> erstellt und die Werte aus dem Array ausgelesen mit Hilfe eines casts reingeschrieben.Die Werte schauen auf den ersten Blick o.k. aus.
Edit: die Werte SIND richtig

-
Ich glaube den 3. Vektor würde ich mir sparen. Da sind ja eh nur 3 Werte drin.
Ansonsten könnte auch boost::multi_array für dich interessant sein.
-
Sollte aus dem Testprogramm was größeres werden muss noch was dran getan werden, das stimmt.
Hab wieder ein Problemchen:
Die Daten hab ich ja jetzt im Speicher und ggf. wurden sie bearbeitet (z.B. ein Grauftufenbild draus gemacht). Jetzt will ich das Ergebnis wieder abspeichern.Auf dei gefahr hin, dass ich mich lächerlich mache hier nochmal ein Stückchen Code (dachte eigentlich das reicht schon, aber das war wohl zu naiv!?):
void saveBMP(AUX_RGBImageRec* image, const char* filename) { FILE *file=NULL; if(file = fopen(filename,"w")) { fwrite(&image, sizeof(image), 1, file); fclose(file); } }Hat jemand ne Hilfestellung oder etwas (nachvollziehbare) online-Literatur für mich. Im Idealfall natürlich auch ein Beispiel

Grüße
mtx
-
o.k. es war zu naiv

hat sich erledigt.Feature-Erkennung muss allerdings noch warten. Da hängt mehr dran, als ich dachte.
-
mtx schrieb:
Danke dir!
Irgendwie hat´s jetzt glaub ich "klick" gemacht.
Ich hab´s hinbekommen, denke ich. Jedenfalls hab ich nen (vermutlich unglaublich ineffizienten) vector<vector<vector<int>>> erstellt und die Werte aus dem Array ausgelesen mit Hilfe eines casts reingeschrieben.Die Werte schauen auf den ersten Blick o.k. aus.
Edit: die Werte SIND richtig

Kannst du bitte den code posten, WIE du es geschafft hast!
(Ich habs auch versucht, und bei mir hats leider nicht "klick" gemacht )
-
void fillUpRGBVector(AUX_RGBImageRec *image) { vector<vector<vector<int>>> tmp; for (unsigned int i = 0; i < image->sizeY; i++) { vector<vector<int>> tmp2; for(unsigned int j = 0; j < image->sizeX; j++) { vector<int> tmp3; tmp3.push_back((int) (image->data[(i * image->sizeY * 3) + (j * 3) + 0])); tmp3.push_back((int) (image->data[(i * image->sizeY * 3) + (j * 3) + 1])); tmp3.push_back((int) (image->data[(i * image->sizeY * 3) + (j * 3) + 2])); tmp2.push_back(tmp3); } tmp.push_back(tmp2); } RGB = tmp; }Wie gesagt sehr unschön, aber es hat funktioniert

RGB ist ein vector<vector<vector<int>>>, der innere vector beinhaltet die RGB-Werte, die äußeren sind für zeile bzw. Spalte daInzwischen hab ich das Ganze auf Matrizen umgestellt, aber da verwende ich auch fremden Code, den ich vermutlich nicht veröffentlichen darf.
Grüßx
mtx