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 da

    Inzwischen hab ich das Ganze auf Matrizen umgestellt, aber da verwende ich auch fremden Code, den ich vermutlich nicht veröffentlichen darf.

    Grüßx
    mtx


Anmelden zum Antworten