使用 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. 多帧图像(动图)的读取与保存