我正在寻找一种解决方案,使用OpenCV在一个窗口中显示连续的帧。我有一系列图像(001.jpg
,002.jpg
,003.jpg
等),但不是视频。我必须在循环内显示它们。如何使用opencv显示连续的帧
标准代码来显示图像是:
IplImage* src = cvLoadImage("001.jpg");
cvNamedWindow("My pic");
cvShowImage("My pic",src);
cvWaitKey();
我正在寻找一种解决方案,使用OpenCV在一个窗口中显示连续的帧。我有一系列图像(001.jpg
,002.jpg
,003.jpg
等),但不是视频。我必须在循环内显示它们。如何使用opencv显示连续的帧
标准代码来显示图像是:
IplImage* src = cvLoadImage("001.jpg");
cvNamedWindow("My pic");
cvShowImage("My pic",src);
cvWaitKey();
作为链接所暗示的,一个选择是将写自动产生正确的文件名的功能,例如:
void loadImage(IplImage *image, int number)
{
// Store path to directory
char filename[100];
strcpy(filename, "/path/to/files");
// Convert integer to char
char frameNo[10];
sprintf(frame, "%03i", number);
// Combine to generate path
strcat(filename, frameNo);
strcat(filename, ".bmp");
// Use path to load image
image = cvLoadImage(filename);
}
这然后可以在一个循环中被用于公知的许多图像的
IplImage *im;
for (int i = 0; i < nImages; ++i)
{
loadImage(im, i);
/*
Do stuff with im
*/
}
另一种选择是调查boost directory iterator。
谢谢克里斯现在的作品:) – user1002079
尝试使用的OpenCV XML/YAML持久性机制。编写用于加载的图像路径列表,并使用循环来读取这些路径并加载图像。在立体声校准的例子中,使用了这样一个列表(OpenCV中安装了一个directory with examples)。
嗨, 谢谢你的回答,但是当我没有很多图片时,这实际上很有用。在我的情况下,我有超过1000张照片,我必须处理。 – user1002079
好吧,他们是否以某种通用的方式命名并且易于自动写下来?我有一个包含近600张照片的数据库,所以我理解这个问题。您不必手动编写它。只需创建一个生成这些文件名称的循环,并将这些名称写入xml文件。像这样: fs << ADDRESS <<“[”;' for(unsigned j = 0; j <_gal [i] .photos.size(); ++ j){ fs << _ gal [i] .photos [J]; } fs <<“]”<<“}”; _gal [int] .photos [int]返回一个带有图片文件路径的字符串。 – morynicz
@克里斯代码的工作,我想增加一个更简单的日常
void loadImage()
{
int nImages = 6;
for (int i = 0; i < nImages; ++i)
{
IplImage *image;
char filename[100];
strcpy(filename, "images/");
char frameNo[10];
sprintf(frameNo, "%03i", i);
strcat(filename, frameNo);
strcat(filename, ".jpg");
image = cvLoadImage(filename);
cvNamedWindow("pic");
cvShowImage("pic",image);
cvWaitKey(1000);
}
}
如果你没有太多的图片,你可以加载所有这些,将它们存储在IplImage结构的数组。然后用以下形式的循环:for(i = 0; i <= n; i ++){if(i == n)i = 0; .........}你可以通过循环遍历它们,直到让你说你按下一个键(cvWaitKey())。 – Adrian