Problem mit Varbiablenwert



  • Hey,

    ich habe ein kleines Programmierproblem und ich hoffe ihr könnt mir helfen:
    Ich schreibe eine Socketanwendung in Verindung mit OpenCV.

    Code:

    void process(void* img) {
    
      IplImage* image = reinterpret_cast<IplImage*>(img);
      if( (bild = fopen( (const char *)image,"rb" )) != NULL ){
                  while(!feof(bild))
    ...
    

    Wenn ich mit Breakpoints arbeite hat an der stelle "IplImage * image" image den Wert: Ox0032cfe0 {nSize = 112 ID = 0 nChannels= 3 ...}

    und an der "Bild = ..." Stelle den selben Wert. Der ist doch != Null, oder?
    Also wieso geht er nicht in die Schleife.

    Danke
    Elli



  • if( (bild = fopen( (const char *)image,"rb" )) != NULL )
      ...
    

    zerlegen wir das mal:

    bild=fopen((const char*)image,"rb");
    if(bild!=NULL)
      ...
    

    Du interpretierst den Speicherbereich hinter image (nSize,ID,nChannels) als Dateiname (char*) - da kommt nur Datenmüll heraus, mit dem fopen() nichts anfangen kann, also liefert es NULL (=Fehler aufgetreten) zurück.



  • Und das bedeutet? Wie kann ich das lösen?



  • Das bedeutet, daß du aus deiner Image-Klasse nicht zurückkommst zum Dateinamen.

    (für weitere Hinweise ist a) die Definition von IplImage und b) dein Ziel hilfreich)



  • Da OpenCV eine in AnsiC geschriebene Bibliothek ist, wird IplImage wohl keine Membervariablen haben. 😉
    Hier muss einfach bei der Funktion process der Dateiname mit übergeben werden.



  • Den Dateinamen habe ich in einer anderen Funktion benutzt, wo das Bild ddargestellt wird.... Wie kann ich den jetz übergeben?

    Filename = Name:

    class Imageprocessor
    {
      IplImage* img; //Bildpointer deklarieren
    
    public:
      Imageprocessor (CString filename, bool display=true){
      img = cvvLoadImage( filename ); // load image
          if (display) {
            // create a window
            cvvNamedWindow( filename, 1 );
            // display the image on window
            cvvShowImage( filename, img ); 
          }
        }
    
      void execute();
      ~Imageprocessor() {
          cvReleaseImage( &img );
        };
    };
    
    extern Imageprocessor *proc;
    

    Dann wird execute im cpp File aufgerufen:

    void Imageprocessor ::execute(){
      process(img, filename);
    }
    

    und schlußendlich wird im selben cpp File process definiert:

    Imageprocessor *proc = 0;
    void process(void* img, filename) {
    
      IplImage* image = reinterpret_cast<IplImage*>(img);
      if( (bild = fopen( (const char *)image,"rb" )) != NULL ){
    

    wie übergebe ich denn den Filename?

    Danke
    Eva



  • Du mußt dir den Dateinamen merken und mit übergeben:

    class Imageprocessor
    {
      IplImage* img;
      CString fname;//neu
    public:
      Imageprocessor (CString filename, bool display=true)
      {
        img = cvvLoadImage( filename );
        fname=filename;//neu
        ...
      }
      void execute()
      { process(img,fname); }
    }
    
    void process(void* img,const CString& name)
    {
      if( (bild=fopen(name,"rb")) != NULL)
        ...
    }
    


  • Super... vielen Dank. Es funktioniert...... 😃


Anmelden zum Antworten