1

ライブラリからFindFirstFileandを使用して、フォルダーのすべての画像をベクターにロードしました。これにより、すべての画像がベクターに保存されましたが、単に表示したいなどの操作をベクターに対して実行したい場合、予期しない操作が行われ、コードの実行を中断する必要があります。FindNextFile<windows.h>images

これが私のコードです:

int _tmain(int argc, _TCHAR* argv[])
{

WIN32_FIND_DATA FindFileData;
HANDLE hFind;


vector<Mat> images;

hFind = FindFirstFile("C:\\test\\*", &FindFileData);
if (hFind != INVALID_HANDLE_VALUE)
{

    do {

        images.push_back(imread(FindFileData.cFileName , 0)); 



        } while( FindNextFile(hFind,&FindFileData));
}

//int vectorsize = (sizeof(images)/sizeof(Mat));

namedWindow("meh" , CV_WINDOW_AUTOSIZE);
    imshow("meh" , images[3]);
    waitKey(0);

/*for(int x = 1; x < 8; x++)
{
    namedWindow("meh" , CV_WINDOW_AUTOSIZE);
    imshow("meh" , images[x]);
    waitKey(0);
}*/

/*vector<Mat>::iterator it;

for (it = images.begin(); it != images.end() ; it++) {
    imshow("myWin", (*it));
    waitKey(0);
}*/

FindClose(hFind);
return 0;
}

ご覧のとおり、ベクトルをイテレータで処理しようとしましたが、で同じエラーが発生しましたimshow

次にsizeof、ベクター内の合計要素を見つけていましたが、失敗しました (ベクターサイズパラメーターが返されたため0) 。

次に、ベクターからランダムな画像を選択して表示しようとしましたが、で同じエラーが発生しましたimshow

EDIT:test フォルダーに 8 つの画像が含まれていないことを望みますが、ループは 10 回実行されます。これは、ディレクトリ内の 1 番目と 2 番目のファイルが と であるためです.(..これは で名前を出力するときに表示されますcout)。もしそうなら、どうすれば回避できますか?

4

2 に答える 2

2

あなたのケースでは、!m.empty()プッシュバックした画像が正しくロードされているかどうかを確認する必要があると思います。

EDIT 部分については、「C:\test\*.jpg」にファイルがあります。それは「。」をスキップします。および「..」(およびその他の画像以外のもの)も。

(複数の拡張子に対して Microsoft の構文 "C:\test\*.jpg;C:\test\*.png" もあったと思いますが、それについてはわかりません。)

于 2012-11-20T06:02:23.197 に答える
1

さて、私はそれを整理しました。問題はFindFileData.cFileName、必要なファイルへの完全なパスではなく、ファイルの名前のみを返すことでしたimread

strcatフォルダーのパスを使用して、見つかったファイル名と連結することで、この問題を解決しました。

images.push_back(imread((strcat(loc,FindFileData.cFileName)) , 0));

もちろん、次のループでは機能しないため、文字列 loc は毎回クリアする必要がありました。

于 2012-11-21T00:30:23.853 に答える