C++ Opencv 读取指定路径中的文件(图片)

本文介绍了一个使用C++实现的递归遍历指定目录下所有文件的方法,并提供了适用于OpenCV项目的改进版本,确保能正确获取图像文件路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

void getAllFiles( string path, vector<string>& files)  
{  
    //文件句柄  
    long   hFile   =   0;  
    //文件信息  
    struct _finddata_t fileinfo;  //很少用的文件信息读取结构
    string p;  //string类很有意思的一个赋值函数:assign(),有很多重载版本
    if((hFile = _findfirst(p.assign(path).append("\\*").c_str(),&fileinfo)) !=  -1)  
    {  
        do  
        {   
            if((fileinfo.attrib &  _A_SUBDIR))  //比较文件类型是否是文件夹
            {  
                if(strcmp(fileinfo.name,".") != 0  &&  strcmp(fileinfo.name,"..") != 0)  
                {
                    files.push_back(p.assign(path).append("\\").append(fileinfo.name) );
                    getFilesall( p.assign(path).append("\\").append(fileinfo.name), files ); 
                }
            }  
            else  
            {  
                files.push_back(p.assign(path).append("\\").append(fileinfo.name) );  
            }  
        }while(_findnext(hFile, &fileinfo)  == 0);  //寻找下一个,成功返回0,否则-1
        _findclose(hFile); 
    } 
}

该函数有两个参数,第一个为路径字符串(string类型,最好为绝对路径);第二个参数为文件夹与文件名称存储变量(vector类型,引用传递)。

结合Opencv 读取指定路径下的图片时,此时会产生程序中断。

进过一番摸索  参照了:opencv中samples\cpp\latentsvm_multidetect.cpp

代码如下:

void getFiles(const string& directoryName, vector<string>& filenames, bool addDirectoryName = true)
{
	
	struct _finddata_t s_file;
	string str = directoryName + "\\*.*";

	intptr_t h_file = _findfirst(str.c_str(), &s_file);
	if (h_file != static_cast<intptr_t>(-1.0))
	{
		do
		{
			if (addDirectoryName)
				filenames.push_back(directoryName + "\\" + s_file.name);
			else
				filenames.push_back((string)s_file.name);
		} while (_findnext(h_file, &s_file) == 0);
	}
	_findclose(h_file);
}


C++中,可以使用OpenCV中的imread函数来读取图像,但是它只支持ASCII字符集的路径。如果路径中包含中文字符,可以尝试以下两种方法。 方法一:使用Unicode编码的路径 可以将中文路径转换为Unicode编码,然后使用wstring类型存储路径,最后使用imread函数读取图像。示例代码如下: ```c++ #include <opencv2/opencv.hpp> #include <iostream> #include <string> using namespace std; using namespace cv; int main() { wstring path = L"D:\\中文路径\\image.jpg"; // 将中文路径转换为Unicode编码 Mat img = imread(string(path.begin(), path.end())); // 将wstring类型转换为string类型 if (img.empty()) { cout << "Failed to read image!" << endl; return -1; } imshow("Image", img); waitKey(0); return 0; } ``` 方法二:使用boost库 可以使用boost库中的filesystem模块来处理中文路径。首先需要安装boost库,并将boost的头文件和库文件链接到工程中。示例代码如下: ```c++ #include <opencv2/opencv.hpp> #include <iostream> #include <string> #include <boost/filesystem.hpp> using namespace std; using namespace cv; using namespace boost::filesystem; int main() { string path = "D:/中文路径/image.jpg"; path p(path); // 将路径转换为boost库中的path类型 Mat img = imread(p.string()); if (img.empty()) { cout << "Failed to read image!" << endl; return -1; } imshow("Image", img); waitKey(0); return 0; } ``` 这两种方法都可以读取中文路径的图像。需要注意的是,在Windows操作系统中,路径分隔符应该使用反斜杠`\`而不是正斜杠`/`。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值