2种方法【readdir和opencv】实现C++读取文件下的多个图片,并保存图片名/完整路径到数组

方法一:readdir(), 无需opencv

        Linux可以直接readdir,然后用d_type来筛选合法文件。但在windows下没有d_type,windows可以用d_name的长度限制来排除非法文件。

        下面代码在Linux和Windows平台均可使用,最终的图片名保存在vector数组中,若需要完整路径,使用字符串拼接即可。

/* Work for both Linux & Win */

#include <iostream>
#include <fstream>
#include <vector>
#include <dirent.h>
#include "sys/types.h"

using namespace std;

int main(){
    const img_dir = "D:/XX/XXX";
    vector<string> img_paths = get_img_files_dir(img_dir);
    cout << "Successfully load " << img_paths.size() << " images." << endl;
    /* 若要完整路径,每次取出图片名,进行字符串拼接即可 */
    // 例如: const combined_dir = img_dir + "/" + img_paths[0];
    return 0;
}


vector<string> get_img_files_dir(const string& directory)
{
    vector<string> file_paths;
    DIR* dir;
    struct dirent* img_entry;

    dir = opendir(directory.c_str());
    if (dir == nullptr) {
        cout << "Please check your Image File Path" << endl;
    }
    else {
        while ((img_entry = readdir(dir)) != nullptr) {
            /*  WORK FOR LINUX */
#ifdef linux
            if (file_name->d_type == DT_REG) {
                file_paths.push_back(file_name->d_name);
            }
#endif
            /*  WORK FOR WINDOWS */
#ifdef _WIN32//__WINDOWS_
            string img_name = img_entry->d_name;
            if (img_name.size() > 4) {                 //这部分长度限制可以自行调整
                file_paths.push_back(img_entry->d_name);
            }
#endif
        }
        closedir(dir);
    }
    return file_paths;
}

方法一参考:(143条消息) C/C++的readdir和readdir_r函数(遍历目录)_墨痕诉清风的博客-CSDN博客

方法二:opencv

        下面代码需要先实现opencv的安装与配置,最终保存在vector数组中的是完整路径名,例如:"D:/XX/XXX/X.jpg"

#include <iostream>
#include <fstream>
#include <vector>
#include <opencv2/opencv.hpp>

using namespace std;

int main()
{
    const string img_dir = "D:/XX/XXX";
    vector<string> img_paths = get_img_files_dir(img_dir);
    cout << "Successfully load " << img_paths.size() << " images for Inference." << endl;
    cout << img_paths[0] << endl;   //直接是完整路径:"D:/XX/XXX/X.jpg"
}


vector<string> get_img_files_dir(const string& directory)
{
    string pattern = directory + "/*.*";
    vector<string> file_paths;
    cv::glob(pattern, file_paths, false);    
    return file_paths;
}

方法二参考:

(143条消息) C++把图片的文件名保存到数组里,opencv库glob()函数_opencv中glob函数_易小侠的博客-CSDN博客

vs+opencv配置教程:(推荐配在debug下,便于调试。如果出错,可尝试在链接器的附加依赖项中,只加opencv_worldxxxd.lib, 不加opencv_worldxxx.lib。带d的表示debug,不带d的表示release)

(143条消息) VS2019+OpenCV安装与配置教程_vs安装opencv_Creama_的博客-CSDN博客https://blog.csdn.net/Creama_/article/details/107238475

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值