使用 OpenCV 读取文件夹中的有序图像序列

Posted

技术标签:

【中文标题】使用 OpenCV 读取文件夹中的有序图像序列【英文标题】:Reading an ordered sequence of images in a folder using OpenCV 【发布时间】:2015-09-13 14:22:08 【问题描述】:

我有以下示例代码,我在其中显示我的网络摄像头。

但是我怎样才能在一个文件夹中显示一系列图片:

0.jpg 
1.jpg 
2.jpg
... and so on 

使用imread?

我想使用该文件夹而不是我的网络摄像头作为输入。

#include <iostream>    
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>

int main()

    cv::VideoCapture capture(0);

    cv::Mat myImage;
    while(1)
    
        capture>> myImage;

        cv::imshow( "HEYO", myImage);
        int c = cv::waitKey(1);

    
    return 0;

【问题讨论】:

【参考方案1】:

1) 您可以将VideoCapture 与filename 一起使用:

filename – 打开的视频文件的名称(例如 video.avi)或图像序列(例如 img_%02d.jpg,它将读取诸如 img_00.jpg、img_01.jpg 之类的示例, img_02.jpg, ...)

2) 或者只是根据计数器更改要加载的图像名称。

#include <opencv2/opencv.hpp>
#include <string>
#include <iomanip>
#include <sstream>

int main()

    std::string folder = "your_folder_with_images";
    std::string suffix = ".jpg";
    int counter = 0;

    cv::Mat myImage;

    while (1)
    
        std::stringstream ss;
        ss << std::setw(4) << std::setfill('0') << counter; // 0000, 0001, 0002, etc...
        std::string number = ss.str();

        std::string name = folder + number + suffix;
        myImage = cv::imread(name);

        cv::imshow("HEYO", myImage);
        int c = cv::waitKey(1);

        counter++;
    
    return 0;

3) 或者您可以使用函数glob 将与给定模式匹配的所有文件名存储在一个向量中,然后扫描该向量。这也适用于非连续数字。

#include <opencv2/opencv.hpp>
using namespace cv;

int main()

    String folder = "your_folder_with_images/*.jpg";
    vector<String> filenames;

    glob(folder, filenames);

    Mat myImage;

    for (size_t i = 0; i < filenames.size(); ++i)
    
        myImage = imread(filenames[i]);
        imshow("HEYO", myImage);
        int c = cv::waitKey(1);
    

    return 0;

【讨论】:

如果我的图片被命名为 0000, 0001,0002 怎么处理? 0011...0012...0121..0141...等等 @Bern 案例 1) img_%04d.jpg, 2) 只需要一点点流操作,或者旧的 sprintf。查看更新的 sn-p,3) 已经可以使用 谢谢您,它可以工作...是否可以使用我的 imread(我在文件夹中的图像序列)作为 VideoCapture? @Bern 是的,请参阅选项 1)您只需要 VideoCapture capture("your_folder/%04d.jpg");

以上是关于使用 OpenCV 读取文件夹中的有序图像序列的主要内容,如果未能解决你的问题,请参考以下文章

使用 OpenCV(C++)读取文件夹中的任何 .jpg 图像 [关闭]

OpenCV 例程 300篇253. 多帧图像(动图)的读取与保存

OpenCV 例程 300篇253. 多帧图像(动图)的读取与保存

读取图像中的像素值并保存在 OpenCv 文件中

OpenCV入门(C++/Python)- 使用OpenCV读取和编写视频

如何创建一个可以使用 Boost 和 OpenCV 读取文件夹中所有图像的程序?