OpenCV按序读取目录文件及glob函数编译报错问题咨询
嘿,我来帮你搞定这两个OpenCV相关的问题,咱们一个一个来梳理:
问题1:如何在OpenCV中按顺序读取目录中的文件并处理?
想要按顺序读取目录里的图片并处理,有两种常用的方法,我都给你列出来:
方法一:用OpenCV自带的glob函数(最方便)
OpenCV的glob函数可以直接匹配指定路径下的文件,不过要注意默认的文件顺序不一定是自然排序(比如会出现img1.jpg、img10.jpg、img2.jpg这种不符合直觉的顺序),所以需要手动做自然排序。
完整步骤和代码示例:
#include <vector> #include <opencv2/core.hpp> #include <opencv2/imgcodecs.hpp> #include <iostream> #include <algorithm> using namespace cv; using namespace std; // 自定义自然排序函数,处理数字文件名的顺序问题 bool naturalSort(const String& a, const String& b) { // 提取文件名中的数字部分(这里假设文件名格式是imgX.jpg,可根据实际调整) size_t aNameStart = a.find_last_of("/\\") + 1; size_t aNameEnd = a.find_last_of("."); string aNumStr = a.substr(aNameStart + 3, aNameEnd - aNameStart - 3); // 取img后面的数字 size_t bNameStart = b.find_last_of("/\\") + 1; size_t bNameEnd = b.find_last_of("."); string bNumStr = b.substr(bNameStart + 3, bNameEnd - bNameStart - 3); return stoi(aNumStr) < stoi(bNumStr); } int main() { String folder = "/home/ragesh/C++/calibration_laptop/images/*.jpg"; vector<String> filenames; // 匹配目录下所有jpg文件 glob(folder, filenames, false); // 对文件名进行自然排序 sort(filenames.begin(), filenames.end(), naturalSort); // 遍历读取并处理图片 for(const auto& filename : filenames) { Mat img = imread(filename); if(img.empty()) { cout << "加载图片失败:" << filename << endl; continue; } // 这里写你的图片处理逻辑,比如显示、特征检测等 cout << "正在处理图片:" << filename << endl; // imshow("当前图片", img); // waitKey(0); } return 0; }
方法二:用C标准库遍历目录(C17及以上)
如果不想依赖OpenCV的glob,可以用C++17新增的<filesystem>库来遍历目录,灵活性更高:
#include <vector> #include <filesystem> #include <opencv2/imgcodecs.hpp> #include <iostream> #include <algorithm> namespace fs = std::filesystem; using namespace cv; using namespace std; int main() { string folder = "/home/ragesh/C++/calibration_laptop/images/"; vector<string> filenames; // 遍历目录,筛选jpg格式的文件 for(const auto& entry : fs::directory_iterator(folder)) { if(entry.path().extension() == ".jpg") { filenames.push_back(entry.path().string()); } } // 自然排序(同样可以用上面的naturalSort函数) sort(filenames.begin(), filenames.end()); // 处理图片 for(const auto& filename : filenames) { Mat img = imread(filename); if(img.empty()) { cout << "加载图片失败:" << filename << endl; continue; } // 处理逻辑... } return 0; }
问题2:编译时出现error: no matching function for call to 'glob(...)'
这个报错主要是三个原因导致的,咱们一一解决:
1. 头文件引用错误
你代码里加的是<glob.h>,这是系统自带的glob头文件,而OpenCV的glob函数需要引用OpenCV的核心头文件,把<glob.h>换成:
#include <opencv2/core.hpp> // 旧版本OpenCV可能需要用#include <opencv2/core/core.hpp>
2. 缺少命名空间
OpenCV的glob函数是在cv命名空间下的,所以要么在调用时加cv::前缀,要么在代码开头加using namespace cv;:
// 方式一:加前缀 cv::glob(folder, filename, false); // 方式二:开头加命名空间 using namespace cv;
3. 路径里的空格问题(隐藏坑)
你原来的路径里有个空格:/home/ragesh/C++ /calibration_laptop/images/*.jpg,这里的C++ 后面多了个空格,会导致路径解析错误,建议去掉空格,改成/home/ragesh/C++/calibration_laptop/images/*.jpg。
修正后的完整代码片段
#include <vector> #include <opencv2/core.hpp> #include <opencv2/imgcodecs.hpp> #include <iostream> using namespace cv; using namespace std; int main() { // 修正路径空格问题 String folder = "/home/ragesh/C++/calibration_laptop/images/*.jpg"; vector<String> filename; // 正确调用OpenCV的glob函数 glob(folder, filename, false); int count = 0; if(count < filename.size()) { Mat img = imread(filename[count]); if(img.empty()) { cout << "读取图片失败:" << filename[count] << endl; } else { // 处理逻辑 cout << "图片加载成功!" << endl; } } return 0; }
内容的提问来源于stack exchange,提问作者Ragesh_
相关产品推荐
相关产品推荐

