2009-07-25 8 views
1

私は、約3000のイメージを含むいくつかのディレクトリをイテレータにしようとしています。私は画像をロードする。イメージが読み込まれたら私はそれをリリースします。 これはエラーを再現するために書くことができる最小のプログラムです。OpenCvでたくさんのMac OSの画像を繰り返し処理する際の問題

124枚の画像を読み込んだり解除したりすると、画像の読み込みが停止します。私はこれがメモリ問題だと思うが、正確にプログラムの読み込みを停止させる原因は何か分かりません。

私はOpenCVを私のMacに使っています。どのバージョンを使用しているかを正確に把握することはできません。

ここに私のプロジェクトのコードがあります。

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; 

}

この方法は、私はを反復していdirectorys内のすべての画像のために呼ばれています。 124個の画像の後、if(img)部分はfalseと評価され、elseブランチが実行されます。後でプログラムの他の部分から画像をロードしようとすると、ロードされません。

を編集してもメモリに問題はありません。 Mac Osの標準最大オープンファイル数は512に変更された後で256です.251イメージを開くことができます。 OpenCVはイメージファイルをロードした後でクローズしないようです。

答えて

3

OpenCvからbugtrackerを検索すると、cvLoadImage with Mac ImageIO leaves file handles openという回答が表示されます。

これはOpenCV Mac実装のバグであると思われます。これを解決する唯一の方法は、OpenCVの新しいバージョンをインストールすることです。

EDIT OpenCVの最新バージョンをリポジトリトランクからインストールすることで問題は解決されます。場合によっては、使用しているフレームワークのBugTrackerのチェックに役立ちます。

+0

Heh、それはあまりにも悪いです:(あなたも狂っていないことを知っていますか? – GManNickG

+0

はい、エラーが私のコードではないことが分かります:) – Janusz

2

メモリに関する動作は、私の経験上、一貫した数字とほとんど関係がありません。一貫性のある唯一の方法は、cvLoadImageに何らかの種類の内部制限がある場合です。これはあまり一般的ではない数字124です。しかし、あなたのロジックは私にとってはうまくいくように、あなたのイメージは解放されるべきです。

あなたのディレクトリがテスト間で変更されていないと思われるので、おそらく125番目のイメージが悪いです。

ロードしようとしているイメージが実際に存在することを確認しましたか?もしそうなら(おそらく)、画像ファイル形式がsupported by OpenCVであることを確認してください。それでも当てはまる場合は、別のエディタで開くことでファイルが破損していないことを確認してください。

あなたはOpenCV help you out with errorsを持つことができます。 cvGetErrStatus()を使用してエラーがあるかどうかを確認してから、cvErrorStr()を使用してテキストの説明を入手してください。

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; 

そして、あなたがキャッチし、ログ、そしておそらく上の反応するためにそれが例外をスローします:あなたのコードは、その後になっ

// 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 
    } 
} 

:あなたはこのような何かを行うことができます。 (または、 std::cerrバージョンを使用している場合はコンソールにエラーを出力してください)

+0

エラーコードはゼロです。したがって、OpenCVはエラーを引き起こさないか、エラーコードを設定しません。 すべての画像をOpenCVでロードしていますが、あまり実行していないので、画像はOpenCVと互換性があります。 – Janusz

+0

最初の100の1つを削除または移動し、問題が新しいビットマップに移動するかどうか確認してください。それは "それは特定の写真"のアイデアを排除します。 – GManNickG

+0

別のディレクトリから始めて、最初は同じエラーが発生しました。画像は20〜60Kの間で同じサイズではありませんが、開ける画像の数は変わりません。 OpenCVにファイルハンドルをリリースさせるために何か他のことをする必要があるのでしょうか?それは私が同じようにとどまることができるイメージの数の理由です。 – Janusz

関連する問題