将许多图像保存到矢量中,但它们不显示

Saved many images to vector but they do not display

本文关键字:显示 图像 许多 保存      更新时间:2023-10-16

我使用<windows.h>库中的FindFirstFileFindNextFile将文件夹的所有图像加载到向量中。这将所有图像保存到向量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打印名称时显示)这可能是导致中断的原因吗?如果是,我该如何解决?

我认为您应该在您的情况下进行!m.empty()检查,看看您推送的图像是否正确加载。

对于EDIT部分:您可以在"C:\test\*.jpg"上找到文件。这也会跳过"."answers".."(以及其他非图像内容)。

(我认为微软也有一个针对多个扩展名的语法"C:\test\*.jpg;C:\test\*.png",但我不确定。)

好吧,我把它整理好了。问题出在FindFileData.cFileName上,因为它只返回文件名,而不是imread所需的文件的完整路径。

我通过使用strcat并将文件夹的路径与找到的文件名连接起来,解决了这个问题。

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

当然,每次都需要清除字符串loc,因为它不适用于下一个循环。