【发布时间】:2014-10-11 18:25:31
【问题描述】:
我正在尝试通过在 Linux 上使用 OpenCV 读取多个名为 001.jpg、002.jpg、003.jpg 及以后的图像文件,并在延迟一段时间后将它们显示在窗口中。这是我的代码-
int main(int argc, char ** argv){
cv::VideoCapture cam("/home/bikz05/Desktop/dataset/%03d.jpg");
if (!cam.isOpened())
cout << "Capture is not opened";
cv::Mat image;
const string Window = "Image Number";
namedWindow(Window, CV_WINDOW_NORMAL);
while(true) {
cam >> image;
if (!image.data) {
std::cout << "Preview Ends" << std::endl;
break;
}
cv::imshow(Window, image);
waitKey(1000);
}
return 0;
}
在主函数的第一行,我什至尝试过使用
cv::VideoCapture cam("/home/bikz05/Desktop/dataset/001.jpg");
我什至尝试将图像与二进制文件放在同一个文件夹中,即使这样也没有帮助。
在这两种情况下,它只显示第一张图像,然后程序退出。请注意,它没有完成。
附: - 在Stack Exchange 和opencv.org 上提供的答案没有产生预期的结果。
【问题讨论】:
-
VideoCapture将尝试将帧存储在Mat中,而不管Mat的大小,因此当您存储第一个图像时,Mat分配以匹配第一个图像尺寸。现在,您目录中的所有其他图像应该与第一个图像大小相同或更小(如果它们更小,它看起来很糟糕,但应该可以工作)。但是,如果某些图像大于第一个图像VideoCapture,则无法将它们存储在为第一个图像分配的相同Mat中,因为它太小了。 -
不,你的推理有缺陷。在发布这个问题之前,我尝试保持 001.jpg 和 002.jpg 相同的图像。但是代码不起作用。
-
尝试将
"/home/bikz05/Desktop/dataset/%03d.jpg"替换为"/home/bikz05/Desktop/dataset/%3d.jpg"。 -
顺便说一句,我认为您可以只写
"/home/bikz05/Desktop/dataset/%1d.jpg",它应该读取所有以1位或更多位命名的文件。 -
@DimaMaligin 以上提到的解决方案都不起作用。