You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:49:12