2011-07-01 40 views
8

OpenCVライブラリからcreatesamplesサンプルを実行しようとしています。私は一度に1つのイメージに読み込むことができ、それは正常に動作するようです。しかし、画像のコレクションを読み込もうとすると、解析エラーが発生します。私のコレクションファイルに無効なものがあるのか​​、他の場所に何かがないのかどうか分かりません。以下は私のテキスト文書の形式です。OpenCVはサンプルを作成します

テキスト文書の詳細:

Target1.JPG 1 0 0 1296 1152 
Target2.jpg 1 0 0 1890 709 

コマンドラインコール:

-info "C:\Users\seb\Desktop\Learning Samples\Target\Target.txt" -num 10 -vec "C:\Users\seb\Desktop\Learning Samples\Target\Target.vec" -maxxangle 0.6 -maxyangle 0 -maxzangle 0.3 -maxidev 100 -bgcolor 0 -bgthresh 0 -w 20 -h 20 

すべてのヘルプは大歓迎です。

+0

コマンドラインコール全体を過ぎてもいいですか? – red1ynx

+0

質問を編集して、指定されたコマンドラインを含めるようにしました。また、テキストファイルは画像と同じディレクトリにあります。 – Seb

答えて

7

あなたが生成したいのPOS画像サンプルの数を指定しない場合は、createsamplesが使用するので、パースエラーがありますデフォルト値は1000です。しかし、注釈テキスト文書に1000個未満のオブジェクトの境界ボックスが含まれていると、解析エラーが発生します。トレーニングカスケードに.vecファイルを使用することはできます。唯一の問題は、番号の情報が間違っていることです。それを修正するには2つの方法があります。

  1. テキストドキュメント内のオブジェクトバウンディングボックスの数を手動で数えます。オプション "-num"の数以下の値を指定してください。 createsamples -info xxxxx.txt -vec pos.vec -num [値]

  2. OPENCV_ROOT_DIR/modules/haartraining/createsamples.cppを修正することができます。 -numが指定されていない場合、テキスト文書内のオブジェクトのバウンディングボックスの数としてPOSサンプルの数を設定

コードスニペット:createsamples.cppで のint NUM = 0。その理由の

cvsamples.cppで

void icvWriteVecHeader(FILE* file, int count, int width, int height) 
{ 
    int vecsize; 
    short tmp; 

    fseek (file , 0 , SEEK_SET); 

    /* number of samples */ 
    fwrite(&count, sizeof(count), 1, file); 
    /* vector size */ 
    vecsize = width * height; 
    fwrite(&vecsize, sizeof(vecsize), 1, file); 
    /* min/max values */ 
    tmp = 0; 
    fwrite(&tmp, sizeof(tmp), 1, file); 
    fwrite(&tmp, sizeof(tmp), 1, file); 

    fseek (file , 0 , SEEK_END); 
} 

int cvCreateTrainingSamplesFromInfo(const char* infoname, const char* vecfilename, 
            int num, 
            int showsamples, 
            int winwidth, int winheight) 
{ 
    char fullname[PATH_MAX]; 
    char* filename; 

    FILE* info; 
    FILE* vec; 
    IplImage* src=0; 
    IplImage* sample; 
    int line; 
    int error; 
    int i; 
    int x, y, width, height; 
    int total; 

    assert(infoname != NULL); 
    assert(vecfilename != NULL); 

    total = 0; 
    if(!icvMkDir(vecfilename)) 
    { 

#if CV_VERBOSE 
     fprintf(stderr, "Unable to create directory hierarchy: %s\n", vecfilename); 
#endif /* CV_VERBOSE */ 

     return total; 
    } 

    info = fopen(infoname, "r"); 
    if(info == NULL) 
    { 

#if CV_VERBOSE 
     fprintf(stderr, "Unable to open file: %s\n", infoname); 
#endif /* CV_VERBOSE */ 

     return total; 
    } 

    vec = fopen(vecfilename, "wb"); 
    if(vec == NULL) 
    { 

#if CV_VERBOSE 
     fprintf(stderr, "Unable to open file: %s\n", vecfilename); 
#endif /* CV_VERBOSE */ 

     fclose(info); 

     return total; 
    } 

    sample = cvCreateImage(cvSize(winwidth, winheight), IPL_DEPTH_8U, 1); 

    icvWriteVecHeader(vec, num, sample->width, sample->height); 

    if(showsamples) 
    { 
     cvNamedWindow("Sample", CV_WINDOW_AUTOSIZE); 
    } 

    strcpy(fullname, infoname); 
    filename = strrchr(fullname, '\\'); 
    if(filename == NULL) 
    { 
     filename = strrchr(fullname, '/'); 
    } 
    if(filename == NULL) 
    { 
     filename = fullname; 
    } 
    else 
    { 
     filename++; 
    } 

    while (num<=0 || total<num) 
    { 
     int count; 

     error = (fscanf(info, "%s %d", filename, &count) != 2); 
     if(!error) 
     { 
      src = cvLoadImage(fullname, 0); 
      error = (src == NULL); 
      if(error) 
      { 

#if CV_VERBOSE 
       fprintf(stderr, "Unable to open image: %s\n", fullname); 
#endif /* CV_VERBOSE */ 
      } 
     } 
     else 
      if (num <= 0) break; 

     for(i = 0; i < count; i++, total++) 
     { 
      error = (fscanf(info, "%d %d %d %d", &x, &y, &width, &height) != 4); 
      if(error) break; 
      cvSetImageROI(src, cvRect(x, y, width, height)); 
      cvResize(src, sample, width >= sample->width && 
         height >= sample->height ? CV_INTER_AREA : CV_INTER_LINEAR); 

      if(showsamples) 
      { 
       cvShowImage("Sample", sample); 
       if(cvWaitKey(0) == 27) 
       { 
        showsamples = 0; 
       } 
      } 
      icvWriteVecSample(vec, sample); 

         if (num > 0 && total >= num) break; 
     } 

     if (num<=0) 
      icvWriteVecHeader(vec, total, sample->width, sample->height); 

     if(src) 
     { 
      cvReleaseImage(&src); 
     } 

     if(error) 
     { 

#if CV_VERBOSE 
      fprintf(stderr, "%s(%d) : parse error", infoname, line); 
#endif /* CV_VERBOSE */ 

      break; 
     } 

     } 

    if(sample) 
    { 
     cvReleaseImage(&sample); 
    } 

    fclose(vec); 
    fclose(info); 

    return total; 
} 
+0

これに戻り、ソースファイルを変更することにしました。これを私に説明してくれてありがとう。 – Seb

+0

こんにちはSeb、どうやってcreatesamples.exeファイルを入手しましたか?私はopencv 2.2を使用していますが、createSamples.exeやその他の.exeファイルが見つかりませんでした。 – MMH

+0

こんにちは@Yiqun Hu、haartrainingとgentleboostを使って600画像を訓練するのにどのくらい時間がかかりますか?おおよその漠然としたアイデアは大いに役立ちます! – user961627

0

Target1.JPG - これはcreatesamples.exeへの相対パスである必要があります。 Target.txtではありません。

私は私のマシン上でそれをテストし、このような結果を持っている:

d:\Programs\OpenCV-2.2.0\msvs-build\bin\Release>opencv_createsamples.exe -info "d:\Programs\OpenCV-2.2.0\msvs-build\bin\Release\Target.dat" -num 10 -vec "d:\Programs\OpenCV-2.2.0\msvs-build\bin\Release\Target.vec" -maxxangle 0.6 -maxyangle 0 -maxzangle 0.3 -maxidev 100 -bgcolor 0 -bgthresh 0 -w 20 -h 20 
Info file name: d:\Programs\OpenCV-2.2.0\msvs-build\bin\Release\Target.dat 
Img file name: (NULL) 
Vec file name: d:\Programs\OpenCV-2.2.0\msvs-build\bin\Release\Target.vec 
BG file name: (NULL) 
Num: 10 
BG color: 0 
BG threshold: 0 
Invert: FALSE 
Max intensity deviation: 100 
Max x angle: 0.6 
Max y angle: 0 
Max z angle: 0.3 
Show samples: FALSE 
Width: 20 
Height: 20 
Create training samples from images collection... 
d:\Programs\OpenCV-2.2.0\msvs-build\bin\Release\Target.dat(3) : parse errorDone. **Created 2 samples** 
+0

したがって、テキスト情報ファイルやコマンドライン引数を変更する必要はありますか?私が尋ねる理由は、私がデバッグしているとき、私はそれがtxtファイルの場所を取り、それをイメージファイルの場所に置き換えることがわかります。完全なCディレクトリの場所を試してみると、フルネームに追加されます。その場合、「C:\ Users \ seb \ Desktop \ Learning_Samples \ Target \ C:\ Users \ seb \ Desktop \ Learning_Samples \ Target \ Target」になります。 .JPG " – Seb

+0

こんにちは@ red1ynx、少しトピック外の質問ですが、 haartrainingとgentleboostを使って、600枚の画像からクラシファイアを訓練するためにopencvを訓練する時間はどれくらいですか?どんな漠然とした考え? – user961627

+0

申し訳ありません@ user961627、私は長い間opencvでやっていません。 – red1ynx

0

一つの理由はinfoファイルのかもしれません。

/ホーム/鉱山/ *顔検出画像/ポジティブ/

を.jpgのフォルダ名のいずれかがその名前にスペースを持つべきではないことを確認してください。上記の "顔検出器の画像"のように、これは "画像"のような他の名前でも、スペースのないものでもなければなりません。

フォルダの名前を.infoファイルの元のパスに変更します。

乾杯!

3

私はwindowsマシン上でopencv_createsamplesを動作させるのに苦労し、うまくいきました。私は他の人を助けるために詳細を投稿すると思った。私はopencv 2.4.8 on Windows 7を使用しています。

まず、パス変数OPENCV_DIRに記載されているディレクトリにopencv_createsamples.exeファイルを使用する必要があることがわかりました。 exeファイルをもっと便利な場所にコピーできませんでした。

このディレクトリに自分の画像とテキストファイル用にサブディレクトリtext_classifierを設定しました。私は、画像で選択した領域の数を一覧表示しなければならなかった

F:\Apps\opencv\build\x64\vc10\bin>opencv_createsamples.exe -vec text_classifier\text_binary_desc -info text_classifier\positive_examples.txt -num 146 -w 1350 -h 900 -bg text_classifier\negative_samples.txt

お知らせ(146 -num):私は、コマンドラインでこのコマンドを使用していました。私はまた、正のサンプルの幅と高さを記載しました。

は、ファイルpositive_examples.txt内では、私はそう記載されているファイルを持つことが必要:つまり

text_positives_clean\1839_Boettiger_001.JPG 1 708 35 471 793

を、ファイルがに相対ファイルpositive_examples.txtに対する列挙されなければならなかった、とではありませんexeファイル(opencv_createsamples.exe)。私のようなexeファイルに対するファイル、一覧表示しようとしたとき:

text_classifier\text_positives_clean\1839_Boettiger_001.JPG 1 708 35 471 793

then I got the error: Unable to open image: text_classifier\text_classifier\text_positives_clean\1839_Boettiger_001.JPG

をそれから私は何とか、このファイルを作成するための私の特別な自動化されたシステムがディレクトリにいくつかのファイルをロード逃していたことに気づいたので、positive_examplesに記載されているファイルがありましたディレクトリになかった.txt。 exeファイルは、ディレクトリにないpositive_examples.txtにリストされているものが見つかった場合、単純に削除されました。私は画像ディレクトリの隙間を埋めました。

text_positives_clean\1862_Streckfuss_0006.JPG 1 813 502 382 353 129 46 526 798 682 780 117 67

はあなたがここに述べた選択領域の数が1であることがわかりますか:私はこのミスを犯していたことを発見し129

:画像を開くことができません:

は、その後、私は奇妙なエラーが発生しました(「JPG」の直後の数字)、選択されたエリアの数は実際に3ですか?そのため、opencv_createsamples.exeは、選択した単一の領域を取得した後、次の画像、つまり '129'を開いてみました。そして、それは再び落ちた。

私は1を3に変更しました。次に、実際に私のpositive_examples.txtファイルに行番号を与えた解析エラーがありました。私はスペースを追加し、これを修正し、最終的にexeファイルはすべて私の146個のサンプルをした

949 315 157 67131 30 513 806

:私はそのラインに行き、私のエントリのいずれかが選択された領域の間にスペースを持っていなかったことがわかった、など。 Yoohoo!

これは誰かを助けることを望みます。 :-)

関連する問題