使用 VideoCapture 读取目录中的图像不起作用
Posted
技术标签:
【中文标题】使用 VideoCapture 读取目录中的图像不起作用【英文标题】:Reading images in directory using VideoCapture not working 【发布时间】: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 以上提到的解决方案都不起作用。
【参考方案1】:
您编写的代码有几个问题,但如果您要从磁盘读取图像,请使用cv::imread()
而不是cv::VideoCapture
:
std::string filename = "/home/bikz05/Desktop/dataset/001.jpg";
const std::string Window = "Image Number";
cv::namedWindow(Window, CV_WINDOW_NORMAL);
while (true)
cv::Mat image = cv::imread(filename.c_str());
if (!image.data)
std::cout << "!!! File not found: " << filename << std::endl;
break;
cv::imshow(Window, image);
cv::waitKey(1000);
// And before the loop ends, update filename with the next image:
// filename = ???;
我没有对此进行测试,但我相信你明白了。
【讨论】:
我确实知道如何使用 imread 阅读,但我想使用 VideoCapture 来阅读。我也可以用其他方法来做,但我想用 VideoCapture 来做。顺便问一下,代码有什么问题? 如果cam.isOpened()
失败,返回。在循环内部而不是外部创建image
。确保用户有权读取该位置的文件。确保所有文件具有相同的扩展名和相同的命名方案。
为了简洁起见,我截断了很多代码,之前有一个返回语句。这不是权限问题。我能够显示第一张图像,然后程序退出。
在循环内部而不是外部创建image
。这是我给你的最后一条消息。
然后按照我建议的方法进行,更容易调试和找出问题。我不知道您使用的是什么版本的 OpenCV,但可能是 VideoCapture
上的一个错误。祝你好运!【参考方案2】:
在glob(folderpath, vectorOfimages)
中使用glob,然后以vectorOfimages[i]
访问每个图像。
vectorOfimages 是
vector<String>
并且文件夹路径是一个字符串。
我遇到了同样的问题,videoCapture
没有解决。
【讨论】:
以上是关于使用 VideoCapture 读取目录中的图像不起作用的主要内容,如果未能解决你的问题,请参考以下文章