如何使用循环处理 Visual C++ 中文件夹中存在的所有图像

Posted

技术标签:

【中文标题】如何使用循环处理 Visual C++ 中文件夹中存在的所有图像【英文标题】:How to use loop to Process all images present in folder in visual C++ 【发布时间】:2014-10-26 12:15:41 【问题描述】:

目标:对文件夹中存在的所有图像一一执行操作 到目前为止:使用objOpenFileDialog->ShowDialog(); 获取第一个文件的名称,然后使用 System::String^ imgName = objFileDialog->FileName; 问题: 1. blank image.data by Mat image = imread("imgName", CV_LOAD_IMAGE_GRAYSCALE); 2. 如何使用循环到达最后一张图片(图片名称为带有特殊字符的数字)?

【问题讨论】:

但你知道,你不能 imread() 使用 System::String^ 吗? 我对'^'有疑问,但无法解决。那我怎样才能得到“image.jpg”? 您必须使用 c++ std::string、const char* 或 cv::String。 opencv 不支持托管 System::String 类型。帮自己一个忙,在托管/表单代码和 opencv 代码之间有一个明确的分水岭。 但是,objFileDIalog->FileName 返回类型是String^。 ***.com/questions/26535662/… 【参考方案1】:

我遇到了和你一样的问题,并且有办法解决它,但不知道这是否是正确的方法。

char * filepath = new char[100];
for(int j=0; j<n_images ; j++) // for all images

    sprintf(filepath,"/home/datasets/img-%i.png",j); // changing the path
    Mat image = imread(filepath, CV_LOAD_IMAGE_GRAYSCALE);

your code here (.....)


我的图片被命名为“img-0.png”、“img-1.png”、“img-2.png”等。您可以将代码调整为您想要的名称。

运行时图像版本数:

Mat image = imread("/home/datasets/img-0.png", CV_LOAD_IMAGE_GRAYSCALE );
int j=0;
while(image.data)

    sprintf(filename,"/home/datasets/img-%i.png",j);
    image = imread(filename, CV_LOAD_IMAGE_GRAYSCALE );
    if(!image.data )
    
        // no more images
        break;
    

    ( your code... )

    j++;

【讨论】:

如果您不知道文件夹中存在的图像数量怎么办? int n_images 应该在运行时设置......但不知道如何。

以上是关于如何使用循环处理 Visual C++ 中文件夹中存在的所有图像的主要内容,如果未能解决你的问题,请参考以下文章

Visual c++ 如何从富文本框中读取

如何在 Windows 上使用 Visual C++ 强制加载链接库

使用 Visual C++ 2008 时如何解决未处理的异常错误?

如何在 Visual c++ 中处理 SEHException?

如何在 Visual Studio C++ 中使用文件夹?

如何在 Visual C++ 中正确调用 CopyFile 函数?