2009-07-25 8 views
1

Ich versuche, über einige Verzeichnisse mit etwa 3000 Bildern zu iterieren. Ich lade das Bild. Wenn das Bild geladen ist, lasse ich es los. Das ist das kleinste Programm, das ich schreiben kann, um den Fehler zu reproduzieren.Problem mit der Iteration über viele Bilder in OpenCv mit Mac OS

Nach dem Laden und Freigeben von 124 Bildern stoppt das Programm das Laden von Bildern. Ich denke, dies ist ein Speicher Problem, aber ich verstehe nicht, was genau bewirkt, dass das Programm aufhört, Bilder zu laden.

Ich verwende OpenCV auf meinem Mac. Ich weiß nicht, wie genau ich herausfinden kann, welche Version ich verwende.

Hier ist der Code von meinem Projekt.

bool FaceDetectionStrategy::detectFace(std::string imagePath) { 

    IplImage *img = cvLoadImage(imagePath.c_str(), CV_LOAD_IMAGE_COLOR); 
    if (img) { 
     std::cout << "Image loaded " << imagePath << std::endl; 
     cvReleaseImage(&img); 
    } else { 
     std::cout << "Image not loaded " << imagePath << std::endl; 
    } 
return true; 

}

Diese Methode für jedes Bild aufgerufen wird, in den directorys ich Iterieren durch. Nach 124 Bildern wird der if (img) Teil zu false ausgewertet und der else Zweig wird ausgeführt. Wenn ich später versuche, Bilder von anderen Teilen des Programms zu laden, werden sie auch nicht geladen.

Bearbeiten es ist kein Speicherproblem. Mac Os Standard max offene Dateien ist 256 nach dem Ändern von 512 kann ich 251 Bilder öffnen. Offenbar schließt OpenCV die Bilddateien nach dem Laden nicht.

Antwort

3

Die Suche nach dem Bugtracker von OpenCv zeigte diese Antwort auf das Problem: cvLoadImage with Mac ImageIO leaves file handles open.

Es scheint, dass dies ein Fehler in der OpenCV-Mac-Implementierung ist und die einzige Möglichkeit, es zu lösen, ist es, eine neuere Version von OpenCV zu installieren.

Bearbeiten Installation der letzten Version von OpenCV aus dem Repository-Stamm löst das Problem.Manchmal hilft es, den BugTracker der verwendeten Frameworks zu überprüfen ...

+0

Heh, das ist schade :(Gut zu wissen, dass du nicht verrückt bist, huh? – GManNickG

+0

Ja fühlt sich gut an zu sehen, dass der Fehler nicht in meinem Code war :) – Janusz

2

Verhalten in Bezug auf Speicher hat selten mit einer konsistenten Anzahl zu tun, meiner Erfahrung nach. Der einzige Weg, wie es konsistent sein könnte, ist, wenn es eine Art internes Limit in cvLoadImage gibt, das zufälligerweise die nicht sehr häufige Nummer 124 ist. Aber Ihre Logik scheint mir gut, dass Ihre Bilder veröffentlicht werden sollten.

Wahrscheinlicher, da ich nehme an, dass Ihre Verzeichnisse zwischen den Tests nicht wechseln, ist dieses 125. Bild schlecht.

Haben Sie verifiziert, dass das Bild, das Sie laden möchten, tatsächlich existiert? Wenn dies der Fall ist (was wahrscheinlich der Fall ist), überprüfen Sie, ob das Bilddateiformat supported by OpenCV lautet. Wenn das auch stimmt, stellen Sie sicher, dass die Datei nicht beschädigt ist, indem Sie sie mit einem anderen Editor öffnen.

Sie können OpenCV help you out with errors haben. Verwenden Sie cvGetErrStatus(), um zu überprüfen, ob ein Fehler aufgetreten ist, und verwenden Sie dann cvErrorStr(), um eine Textbeschreibung zu erhalten. Sie können etwas tun:

// I would recommend putting this in a file, like CVUtility.h 

#include <exception> 

void check_CV_Error(void) 
{ 
    int errorCode = cvGetErrStatus(); 
    if (errorCode) // I'm assuming 0 means no reportable error 
    { 
     throw std::runtime_error(cvErrorStr(errorCode)); 
     // std::cerr << cvErrorStr(errorCode); 
     //^if you would rather not use exceptions 
    } 
} 

Ihr Code wird dann:

bool FaceDetectionStrategy::detectFace(std::string imagePath) { 

    IplImage *img = cvLoadImage(imagePath.c_str(), CV_LOAD_IMAGE_COLOR); 
    if (img) { 
     std::cout << "Image loaded " << imagePath << std::endl; 
     cvReleaseImage(&img); 
    } else { 
     std::cout << "Image not loaded " << imagePath << std::endl; 
     check_CV_Error(); // find reason for error 
    } 
return true; 

Und das wird eine Ausnahme für Sie zu fangen und sich einzuloggen, und möglicherweise reagieren auf. (Oder drucken Sie den Fehler an die Konsole, wenn Sie die std::cerr Version verwenden)

+0

Der Fehlercode ist Null. Entweder verursacht OpenCV den Fehler nicht oder setzt keinen Fehlercode. Ich habe alle Bilder mit OpenCV vor, aber nicht so viel in einem Lauf geladen, so dass die Bilder kompatibel zu OpenCV sein sollten. – Janusz

+0

Versuchen Sie, eines der ersten 100 zu löschen oder zu verschieben, und prüfen Sie, ob sich das Problem selbst auf ein neues Bitmap verschiebt. Das wird "es ist ein bestimmtes Bild" Ideen beseitigen. – GManNickG

+0

Beginnend mit einem anderen Verzeichnis erzeugte zuerst der gleiche Fehler. Die Bilder haben nicht alle die gleiche Größe zwischen 20 und 60 K, aber die Anzahl der Bilder, die ich öffnen kann, bleibt gleich. Vielleicht muss ich etwas anderes tun, um OpenCV zu erzwingen, das den Dateigriff freigibt? Das wäre ein Grund dafür, dass die Anzahl der Bilder, die ich laden kann, gleich bleibt. – Janusz