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

5

我想使用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");

但是,这个方法对我的情况仍然不起作用。这些图像大小不同,因此我将首先读取它们,调整大小,然后对每个图像进行进一步的处理。我应该怎么做?我正在使用Windows7和VisualStudio。谢谢。


嗨,"not working" 是什么意思?它是否读取了某些图像并在某个时候崩溃了?你有报错吗? - Quentin Geissmann
它给我这个错误:'Error opening file (../../modules/highgui/src/cap_ffmpeg_impl.hpp:529)'。 - E_learner
这个错误是针对列表中的第一个文件,对吗? - Quentin Geissmann
顺便说一下,我已经包含了我项目所需的所有“.dll”文件,甚至将它们全部复制到了项目目录中。因此,我不认为这是“缺少dll文件”的错误。你有什么想法吗? - E_learner
让我们在聊天中继续讨论 - Quentin Geissmann
显示剩余4条评论
4个回答

5

从我的经验来看,即使没有指定格式,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.

看起来这是一个 bug。可以在下面的链接中找到官方的示例:

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


4

根据此链接所述,需要这样做:

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

即在C后只需一个冒号:,2位文件名序列需要%2d

同样地,您的第二个示例可能应该是:

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

你具体尝试了什么?在上面的第一个例子中,你是否修复了两个问题?你尝试过第二个例子吗? - Paul R
对于双冒号'::',实际上那是我的笔误,非常抱歉。在我的代码中,我只使用了一个单独的冒号':'. 但似乎这不是错误的原因。我已经在问题中更正了这个错误。 - E_learner

1
使用glob函数,如:glob(文件夹路径, 图像向量) 然后访问每个图像,如vectorOfimages[i]。
vectorOfimages是:
 vector<String>

并且folderpath是一个字符串。


0
我们需要像这样声明:
VideoCapture vcap("C:\\pathDirectory\\folderName\\drop%d.bmp");

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接