使用 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 读取目录中的图像不起作用的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 OpenCV 从辅助网络摄像头读取 VideoCapture 中的帧

OpenCV学习笔记2基础:读取播放保存视频

OpenCV学习笔记2基础:读取播放保存视频

OpenCV学习笔记2基础:读取播放保存视频

OpenCV学习笔记2基础:读取播放保存视频

OpenCV学习笔记2基础:读取播放保存视频