OpenCV:从文件夹中读取图像系列

Posted

技术标签:

【中文标题】OpenCV:从文件夹中读取图像系列【英文标题】:OpenCV: Reading image series from a folder 【发布时间】:2013-05-18 18:33:44 【问题描述】:

我正在尝试使用 OpenCV 的 VideoCapture 函数从文件夹中读取一系列图像。在网上搜索了一下,我现在的代码是这样的:

cv::VideoCapture cap ( "C:\\Users\\Admin\\Documents\\Images\\%02d.jpg");

我期待看到VideoCapture 函数应该读取该文件夹中具有两个序列数字名称的所有图像,例如01.jpg, 02.jpg, ..., 30.jpg。有人在互联网上告诉我,一旦我给出第一张图像的位置和名称,VideoCapture 函数应该可以捕捉所有这些图像。所以我也尝试这样做:

cv::VideoCapture cap ("C:\\Users\\Admin\\Documents\\Images\\01.jpg");

但这仍然行不通,至少对我这里的情况不适用。这些图像大小不同,因此我将首先阅读它们,调整它们的大小,然后对它们进行进一步处理。我怎样才能做到这一点?我正在使用带有 VisualStudio 的 Windows7。谢谢你。

【问题讨论】:

嗨,“不工作”是什么意思?它会读取一些图像并在某些时候崩溃吗?你得到一个错误吗? 它给了我这个错误:'Error opening file (../../modules/highgui/src/cap_ffmpeg_impl.hpp:529)'。 它对列表的第一个文件给出了这个错误,对吗? 确实如此。即使我将部分 '01.jpg' 更改为 '%2d.jpg' 仍然会出现此错误。 顺便说一句,我已经为我的项目包含了所有必要的“.dll”文件,甚至将它们全部复制到了项目目录中。所以我不认为这是“缺少 dll 文件”的错误。你有什么想法吗? 【参考方案1】:

根据我的经验,即使不指定格式,VideoCapture 也可以读取一系列图像。 例如。以下工作正常:

std::string pathToData("cap_00000000.bmp");
cv::VideoCapture sequence(pathToData);

图像被顺序读取:

Mat image;
sequence >> image; // Reads cap_00000001.bmp

但是:这仅适用于图像位于可执行文件的文件夹中的情况。我想不出这样指定一个目录:

std::string pathToData("c:\\path\\cap_00000000.bmp");
std::string pathToData("c://path//cap_00000000.bmp");
// etc.

似乎是一个错误。一个官方的例子可以在这里找到:

http://kevinhughes.ca/tutorials/reading-image-sequences-with-opencv/ https://github.com/Itseez/opencv/pull/823/files

【讨论】:

【参考方案2】:

根据this link应该是:

cv::VideoCapture cap("C:/Users/Admin/Documents/Images/%2d.jpg");
                      ^^^                             ^^^

即在 C%2d 之后只有一个 :,用于 2 位文件名序列。

同样你的第二个例子应该是:

cv::VideoCapture cap("C:/Users/Admin/Documents/Images/01.jpg");
                      ^^^

【讨论】:

您尝试了什么,特别是 - 您在上面的第一个示例中解决了 both 问题吗?你试过第二个例子吗? 对于双 ':',实际上是我的错字,抱歉。在我的代码中,我实际上只使用了一个“:”。但似乎这不是错误的原因。我在我的问题中编辑了这个错误。【参考方案3】:

在 glob(folderpath, vectorOfimages) 中使用 glob 然后以 vectorOfimages[i] 的形式访问每个图像。

vectorOfimages 是

 vector<String>

并且文件夹路径是一个字符串。

【讨论】:

【参考方案4】:

我们需要这样声明

VideoCapture vcap("C:\\pathDirectory\\folderName\\drop%d.bmp");

我这样声明,它对我来说很好用,因为我的图像名称是 drop1.bmp、drop2.bmp、drop3.bmp ……等等

【讨论】:

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

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

C 编程和 OpenCV(如何从文件中读取图像并将其加载以在 openCv 中进行进一步处理)

二.使用 OpenCV 读写视频

OpenCV-视频读写(java版)

在opencv中读取视频文件的连续图像

opencv如何批量读取文件夹中图片