Speicherproblem durch Mehrdimensionales Feld [OPENCV]



  • Hallo!

    Mein erster Beitrag 🙂 wird sicher nicht mehr mein letzter...
    also!

    Ich habe eventuell ein SPeicherproblem in meinem PRogramm.

    using namespace std;
    
    int main()
    
    { int a[800][600];
    int **aa = (int**)malloc( sizeof(int *) * 800);
    for (int i = 0; i < 800; ++i) { aa[i] = a[i]; }
    int height,width,step,channels;
    uchar *data;
    int i,j,h;
    double grauwert[255];     
    FILE *f;  
    f=fopen("C:\\Histogramm.txt","a");   
    int k;
    CvScalar s;     
    for (i=0;i<256;i++) {grauwert[i]=0;}
    i=0;
    j=0;
    IplImage* img = 0;  
    IplImage* imageip = cvLoadImage("C:\\final2.bmp");
    IplImage* imageop = cvCreateImage(cvGetSize(imageip),8,1);
    IplImage* final = cvCreateImage(cvGetSize(imageip),8,1);
    //s=cvGet2D(imageop,1,2);
    imageop = cvCloneImage(imageip);
    
      height    = imageop->height;
      width     = imageop->width;
      printf("%i hoehe %i breite\n",height,width);
    // --- QUELLCODE BIS HIERHIN OKAY !! ---
    
    for (int x=0;x<height;x++) 
     { for (int y=0;y<width;y++)
         { 
         [b]cvGet2D(imageop,x,y);[/b] // schau dir den i,j -ten Grauwert an
         a[i][j]= static_cast<int>(s.val[0]);  
         for (h=0;h<256;h++) { if (s.val[0]==h) {grauwert[h]++; } }
         if (s.val[0]>40) {s.val[0]=255; cvSet2D(final,i,j,s); } // zum grauwertsetzen auf schwarz! schwelle=40
          else if (s.val[0]<=40)  {s.val[0]=0; cvSet2D(final,i,j,s);} // zum grauwertsetzen auf schwarz! schwelle=40
         //printf("[%i][%i] G = %f\n",i,j,s.val[0]); // Gibt die Werte aus   
    
         }
     }
    
     for (h=0;h<256;h++) { fprintf(f,"%f\n",grauwert[h]); } // Grauwertanalyse in Datei!
    
            cvReleaseImage(&imageip ); // Speicherfrei!
            cvReleaseImage(&imageop ); // Speicherfrei!
            cvSaveImage("C:\\final3.bmp", final );
    
                   cvReleaseImage(&final );
    
        system("PAUSE");
        return 0;
    }
    

    In der markierten Stelle schmiert mir das Programm ohne Fehlermeldung ab.
    Wenn ich die beiden Schleifen nur bis 100 zählen lasse gibt es keine Probleme.
    Entferne ich sämtliche Bezüge zu dem 2D Array gibt es auch keine Problem.

    Ich weiß nicht weiter 😞



  • Ich würde mal mit dem Debugger durchgehen und schauen, ob die Variablen richtig gesetzt sind. Durch Auskommentieren von Teilen des Codes kannst du den Fehler auch recht gut einschränken.

    Zudem ist dein Code fast durchgehend C. Vielleicht hast du noch nicht so viel Erfahrung, aber mit der Zeit solltest du deinen Code besser strukturieren, indem du mehr Funktionen und Klassen einsetzt. Variablen sollten ausserdem erst deklariert werden, wenn sie benötigt werden, und nicht vorsorglich am Anfang des Blockes. Gewisse Dinge könne man in C++ auch sauberer und weniger fehleranfällig lösen, zum Beispiel Streams verwenden und weniger rohes Zeigerhantieren. Oder zumindest new statt malloc() . 😉



  • MuhCow schrieb:

    Hallo!

    Mein erster Beitrag 🙂 wird sicher nicht mehr mein letzter...
    also!

    Ich habe eventuell ein SPeicherproblem in meinem PRogramm.

    int main()
    {
        int a[800][600]; // 800*600*sizeof(int) = zu gross
    // (...)
    }
    

    Wenn wir davon ausgehen dass ein int 4 Byte hat, dann hätte dein Array "a" 800*600*4 Byte = 1920000 Byte ~~ 1,83 MB.
    Der Stack ist üblicherweise aber nur 1MB gross -> Stack Overflow -> Programm schmiert ab. Quod erat expectandum.
    Leg das Array mal mit "new" an:

    int main()
    {
        int (*a)[600] = new int [800][600];
    // (...)
        delete [] a;
    }
    

    ...oder so...

    struct helper
    {
        int a[800][600];
    };
    
    int main()
    {
        std::auto_ptr<helper> guard(new helper);
        int (*a)[600] = &guard->a[0];
    // (...)
    }
    


  • Ich danke euch beiden (Nexus, hustbaer) für die nützliche und erfolgreiche Hilfe 🙂

    juchu!


Log in to reply