【01】OpenCV C++实战篇——读取文指定文件夹下的所有图片,操作后存储指定文件夹下

使用OpenCV C++库,该博客详细介绍了如何读取指定文件夹下的所有图片,进行一些操作后,再将处理后的图片保存到另一个指定的文件夹中,涉及计算机视觉的基本应用。

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

文章目录

#include<opencv2/opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main
<think>好的,用户想要用C++OpenCV实现批量读取文件夹中的各种格式图片。我需要结合之前的引用资料来回答这个问题。 首先,引用[1]中提到了使用cv::utils::fs::glob来获取指定格式的件,比如*.jpg。但用户需要的是所有格式的图片,所以可能需要调整通配符。比如用"*.*"来匹配所有件,不过这样可能会包含非图片件,可能需要过滤。 然后引用[2]中的代码用了cv::glob,参数是"/*.*",这会获取所有件,但用户需要的是图片,可能需要检查件扩展名。不过OpenCV的cv::imread会自动判断格式,但读取图片件可能会失败,所以最好在读取前过滤一下。 引用[3]提到的是从txt件中读取图片列表,但用户没有提到需要这个,所以可能不需要这部分。不过可以考虑在代码中添加扩展名过滤,比如只接受.jpg、.png等常见图片格式。 用户的需求是读取所有格式的图片,所以可能需要两种方法:一种是使用OpenCV的glob函数获取所有件,然后过滤出图片扩展名;另一种是直接读取所有件,并在读取时处理错误。 现在,我需要整理步骤。首先,确定文件夹是否存在,然后获取所有件路径,过滤出图片扩展名,再逐个读取。或者使用通配符匹配所有件,但可能有非图片件需要处理错误。 考虑到不同平台的兼容性,使用OpenCV的utils::fs模块比较好,比如cv::utils::fs::glob。但需要注意不同版本的OpenCV可能有不同的函数,比如cv::glob和cv::utils::fs::glob的区别。 然后,代码示例部分需要展示如何获取所有件,然后过滤扩展名。或者使用通配符,但可能需要更灵活的处理。例如,用多个通配符来匹配不同格式,但OpenCV的glob可能不支持多个模式,所以可能需要分多次获取不同扩展名,然后合并结果。 或者,先获取所有件,然后逐个检查扩展名是否为图片格式。例如,检查件名是否以.jpg、.png、.bmp等结尾。这种方法更可靠,可以确保只处理支持的图片格式。 在代码中,可以先使用cv::glob获取所有件路径,然后遍历每个路径,检查扩展名是否在支持的列表中。如果支持,则读取图片;否则跳过。 此外,用户可能需要处理不同平台下的路径分隔符问题,但OpenCV的glob函数应该能处理这些。 总结步骤: 1. 使用cv::glob或cv::utils::fs::glob获取文件夹下所有件路径。 2. 过滤这些路径,保留支持的图片格式扩展名。 3. 遍历过滤后的路径,用cv::imread读取图片。 4. 处理读取失败的情况,比如非图片件或损坏的件。 在代码示例中,需要包含必要的头件,检查文件夹是否存在,获取件列表,过滤扩展名,然后读取图片。同时,要处理不同扩展名的大小写问题,比如.JPG和.jpg都应该被接受。 可能的错误点:用户可能没有正确设置OpenCV的配置,或者路径错误,需要提示用户确保路径正确,并且OpenCV支持相应的图片格式。 最后,生成相关问题,比如如何批量处理图片、处理不同扩展名、性能优化等。</think>使用C++OpenCV批量读取文件夹中多种格式图片可通过以下两种方法实现: ### 方法一:使用OpenCV的glob函数(推荐) ```cpp #include <iostream> #include <vector> #include <opencv2/opencv.hpp> std::vector<std::string> get_image_paths(const std::string& directory) { std::vector<std::string> img_paths; cv::glob(directory + "/*.*", img_paths, false); // 获取所有件路径 // 过滤非图片格式 img_paths.erase(std::remove_if(img_paths.begin(), img_paths.end(), [](const std::string& path) { std::string ext = path.substr(path.find_last_of(".") + 1); std::transform(ext.begin(), ext.end(), ext.begin(), ::tolower); return !(ext == "jpg" || ext == "jpeg" || ext == "png" || ext == "bmp"); }), img_paths.end()); return img_paths; } int main() { std::string img_dir = "D:/images"; std::vector<std::string> img_paths = get_image_paths(img_dir); for (const auto& path : img_paths) { cv::Mat img = cv::imread(path); if (img.empty()) continue; // 添加图像处理逻辑 } return 0; } ``` ### 方法二:使用OpenCV件系统工具 ```cpp #include <opencv2/core/utils/filesystem.hpp> int main() { std::string img_dir = "../imgs"; if (!cv::utils::fs::exists(img_dir)) { std::cerr << "文件夹不存在" << std::endl; return -1; } std::vector<cv::String> img_paths; cv::utils::fs::glob(img_dir, "*.*", img_paths); // 获取所有件 // 过滤图片格式(同上) // ... } ``` ### 关键实现说明: 1. **路径匹配**:使用通配符`*.*`获取所有件,再通过扩展名过滤常见图片格式[^1][^2] 2. **格式过滤**:支持`.jpg, .jpeg, .png, .bmp`等格式,通过`transform`统一转为小写处理大小写问题 3. **异常处理**:使用`cv::imread`读取时需检查返回的Mat是否为空,避免处理非图像件 4. **跨平台兼容**:`cv::glob`函数可自动处理不同操作系统的路径分隔符差异[^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

R-G-B

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值