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......
