如何用OpenCV和C++将多张图片分别存入独立矩阵(替代硬编码)
替代硬编码批量读取图片到Mat矩阵的方法(C++/OpenCV)
我有一个包含100多张图片的文件,需要将每张图片分别存入独立的Mat矩阵中。是否有办法替代如下所示的硬编码方式实现该需求?
Mat src1 = imread("ts_04-11-21_16-27-00-mod", CV_8UC1); Mat src2 = imread("ts_04-11-21_16-27-01-mod", CV_8UC1); Mat src3 = imread("ts_04-11-21_16-27-02-mod", CV_8UC1); Mat src4 = imread("ts_04-11-21_16-27-03-mod", CV_8UC1); Mat src5 = imread("ts_04-11-21_16-27-04-mod", CV_8UC1);我正在使用OpenCV和C++进行开发。
当然可以不用硬编码啦!这种重复代码写起来又麻烦又容易出错,用C++的容器配合循环就能轻松解决,而且不管你有100张还是1000张图片,都能灵活处理。下面给你两种常用的实现方式:
一、文件名有规律的情况(比如你的示例)
从你的代码看,文件名的末尾是按00、01、02...递增的,这种情况直接循环生成文件名就行,用vector<Mat>来存储所有的图片矩阵——这比一个个定义src1、src2要方便太多了。
#include <vector> #include <string> #include <iostream> #include <opencv2/opencv.hpp> using namespace cv; using namespace std; int main() { vector<Mat> images; const int total_images = 100; // 替换成你实际的图片数量 for (int i = 0; i < total_images; ++i) { // 用OpenCV的format函数生成带格式的文件名,%02d保证数字是两位(补0) string filename = format("ts_04-11-21_16-27-%02d-mod", i); Mat img = imread(filename, CV_8UC1); // 一定要检查图片是否读取成功,避免空矩阵影响后续操作 if (!img.empty()) { images.push_back(img); } else { cout << "警告:无法读取图片 " << filename << endl; } } // 之后可以通过images[0]、images[1]...访问对应的Mat矩阵 // 比如访问第1张图片:Mat first_img = images[0]; return 0; }
二、文件名无规律,需要遍历目录的情况
如果你的图片文件名没有固定规律,那就直接遍历整个目录下的图片文件。C++17开始自带的filesystem库就能轻松实现,不用依赖第三方库。
#include <vector> #include <string> #include <iostream> #include <filesystem> #include <opencv2/opencv.hpp> namespace fs = std::filesystem; using namespace cv; using namespace std; int main() { vector<Mat> images; const string image_dir = "./your_image_folder"; // 替换成你的图片目录路径 // 遍历目录下的所有文件 for (const auto& entry : fs::directory_iterator(image_dir)) { string filename = entry.path().string(); // 过滤出图片格式(可以根据你的实际格式调整) if (filename.ends_with(".png") || filename.ends_with(".jpg") || filename.ends_with(".bmp")) { Mat img = imread(filename, CV_8UC1); if (!img.empty()) { images.push_back(img); } else { cout << "警告:无法读取图片 " << filename << endl; } } } // 同样通过images[index]访问对应的矩阵 return 0; }
注意:使用filesystem库的话,编译时要开启C++17支持,比如GCC编译命令要加-std=c++17,部分旧版本可能还需要额外链接库:-lstdc++fs。
不管哪种方式,用vector<Mat>存储都是最优选择——既避免了硬编码的繁琐,又能灵活管理任意数量的图片矩阵,后续处理起来也更方便。
内容的提问来源于stack exchange,提问作者CactusHam
相关产品推荐
相关产品推荐

