1

我使用FindFirstFileFindNextFile<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:我不想测试文件夹包含 8 个图像,但循环运行 10 次。这是因为目录中的第一个和第二个文件是...(这在打印名称时显示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 回答