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

时间:2013-05-23 11:54:56

标签: image opencv image-processing video-capture video-processing

我正在尝试使用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。谢谢。

4 个答案:

答案 0 :(得分:5)

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

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

按顺序读取图像:

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

HOWEVER:仅当图像位于可执行文件的文件夹中时才有效。我无法指出这样的目录:

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

答案 1 :(得分:4)

根据this link,它必须是:

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

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

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

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

答案 2 :(得分:1)

在glob中使用glob(folderpath,vectorOfimages) 然后访问每个图像作为vectorOfimages [i]。

vectorOfimages是

 vector<String>

和folderpath是一个字符串。

答案 3 :(得分:0)

我们需要像这样声明

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

我这样宣布它对我来说很好,因为我的图片名称是drop1.bmp,drop2.bmp,drop3.bmp ......等等