在opencv中读取视频文件的连续图像

Posted

技术标签:

【中文标题】在opencv中读取视频文件的连续图像【英文标题】:Reading successive images of a video file in opencv 【发布时间】:2013-05-02 23:49:06 【问题描述】:

我目前正在处理一个项目,目前我需要从视频中提取连续帧,然后查找并匹配它们的特征。问题是当我调用 VideoCapture::read(Mat &image) 时,它会覆盖我想与同一图像进行比较的两个图像。我认为这可能是因为使用了相同的缓冲区,因此两个值都指向同一个空间。我只是不确定如何解决这个问题。

问题代码如下:(不用担心异常处理不好)

    Mat m1, m2;
VideoCapture cap(argv[1]);
if(!cap.isOpened())
    throw std::exception("Could not open the file");

int num = 0;

while(num < 20)
    try
    cap.read(m1);
    cap.read(m2);

    num++;  
    match(m1,m2,num);

    catch(std::exception)
        std::cout << "Oh no!";
    

match(m1,m2,num) 做特征检测业务,输出一张图片 "Image_%d.jpg" ,num。此图像是两个图像并排显示匹配。但是,此图像连续两次是同一图像。 match() 确实有效,因为我已经用静止图像对其进行了测试,所以我相信问题出在 cap.read 代码中。 任何帮助/建议将不胜感激。

【问题讨论】:

你确定两张图片是一样的吗?如果它们是连续的帧,它们可能在视觉上是相同的,但实际上有非常小的差异。如果这不是问题,这个页面有一些关于克隆帧图像的信息(搜索 VideoCapture::read) - docs.opencv.org/modules/highgui/doc/… 是的,它们完全一样,我已经逐步检查了图像以确保这一点。链接中的克隆适用于早期版本,并且主要处理 c IplImage 而不是更易于使用的 c++ cv::Mat。只是设置图像然后克隆我设置它的变量似乎可以解决问题,或多或少地强制对其进行深层复制。 是的,我在发表评论后就看到了您的回答。我对 OpenCV 不是很熟悉,所以不知道版本之间的差异。只是想我会分享我的 5 分钟谷歌研究。很高兴您找到了解决方案。 【参考方案1】:

这就像确保每个图像都是捕获图像的深层副本一样简单。

m1 >> cap
m1 = m1.clone();

成功了,虽然没有我希望的那么优雅。

【讨论】:

除非你只是在玩醉,否则不是这样的。 我在这里看不到任何其他答案,Thomas。也许您可以提供一些实际的输入,而不仅仅是装袋我的。就像我说的,它可以做我想做的事,但它是一种 hacky 方式。 OP 解决了他自己的问题。无需投票!如果您不喜欢它,请发布您自己的答案。在这里 +1 进行补偿。

以上是关于在opencv中读取视频文件的连续图像的主要内容,如果未能解决你的问题,请参考以下文章

opencv读取ENVI标准格式

二.使用 OpenCV 读写视频

opencv 怎样从MP4格式视频中读取一帧

OpenCV 例程 300篇252.视频文件的读取与保存

OpenCV 例程 300篇252.视频文件的读取与保存

OpenCV 例程 300篇252.视频文件的读取与保存