使用opencv遍历文件夹内的图片然后显示到最后一张图片的时候会报错。

用opencv遍历图片,并且显示文件夹内的图片,假设文件夹内有五张需要显示的图片,然后在显示完这五张图片以后,就会发生报错。
问题相关代码,ShowImage::ReadLoadImage()

{
string pattern_jpg = "D:\1-509\W\.tif";//.jpg 等允许的格式都可以,根据实际情况选择

vector<cv::String> image_files;
cv::glob(pattern_jpg, image_files);
if (image_files.size() == 0) 
{
    std::cout << "No image files" << std::endl;
    
}

for (unsigned int frame = 0; frame < image_files.size(); frame++) {//image_file.size()代表文件中总共的图片个数
    Mat image = imread(image_files[frame]);
    char windowname[100];
    sprintf(windowname,"window%d.tif",frame);
    namedWindow(windowname);
    double scale=0.3;
    vector<Mat> images;
    images.emplace_back(cv::imread(image_files[frame]));
    Size dsize = Size(imread(image_files[frame]).cols * scale, imread(image_files[frame]).rows * scale);
    Mat image2 = Mat(dsize, CV_32S);
    resize(imread(image_files[frame]), image2, dsize);
    if(imread(image_files[frame]).rows>1000)
    {
        
        imshow(windowname, image2);
        waitKey(1000);
    }
    else
    {
        imshow(windowname,image);
        waitKey(1000);
    }
}

}

运行结果及报错内容 :

Windows 已在 1.exe 中触发一个断点。

其原因可能是堆被损坏,这说明 1.exe 中或它所加载的任何 DLL 中有 Bug。

原因也可能是用户在 1.exe 具有焦点时按下了 F12。

输出窗口可能提供了更多诊断信息。

####最终是想让图片正常显示并且不会报错。

我擦,你这代码一言难尽。

首先,你每个循环打印一下文件名image_files[frame],看看是不是文件名不对。

其次,每次循环,你都无数次imread(image_files[frame])从磁盘读文件,要虐死磁盘的节奏。每次循环只要一次就可以,将图像放到一个对象里Mat image=imread(...)。