我使用FindFirstFile
库中的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:
我不想测试文件夹包含8个图像,但循环运行10次。这是因为目录中的第一个和第二个文件是.
和..
(这在使用cout
打印名称时显示)这可能是导致中断的原因吗?如果是这样,我该如何解决呢?
答案 0 :(得分:2)
我认为在你的情况下你应该进行!m.empty()
检查以查看你推回的图像是否正确加载。
对于编辑部分:您可以在“C:\ test \ * .jpg”上找到文件。那会跳过“。”和“..”(和其他非图像的东西)也是。
(我认为还有一个Microsoft语法“C:\ test \ *。jpg; C:\ test \ * .png”用于多个扩展,但我不确定。)
答案 1 :(得分:1)
好吧,我把它整理好了。问题出在FindFileData.cFileName
,因为它只返回文件的名称,而不是文件的完整路径,imread
需要。
我通过使用strcat
并将文件夹的路径与找到的文件名连接来解决了这个问题。
images.push_back(imread((strcat(loc,FindFileData.cFileName)) , 0));
当然需要每次清除字符串loc,因为它不适用于下一个循环。