视频文件中的垫子数组 - opencv

Posted

技术标签:

【中文标题】视频文件中的垫子数组 - opencv【英文标题】:Array of Mats from video file - opencv 【发布时间】:2014-10-16 19:23:06 【问题描述】:

我在 Linux 上使用 C++ 和 opencv 进行编码。我找到了this 类似的问题;虽然,我不能让它工作。

我想要做的是读入一个视频文件并将一定数量的帧存储在一个数组中。超过这个数字,我想删除第一帧并将最近的帧添加到数组的末尾。

这是我目前的代码。

VideoCapture cap("Video.mp4");
int width = 2;
int height = 2;
Rect roi = Rect(100, 100, width, height);

 vector<Mat> matArray;
int numberFrames = 6;
int currentFrameNumber = 0;

for (;;)

    cap >> cameraInput;
    cameraInput(roi).copyTo(finalOutputImage);

    if(currentFrameNumber < numberFrames)
        matArray.push_back(finalOutputImage);
    else if(currentFrameNumber <= numberFrames)
        for(int i=0;i<matArray.size()-1; i++)
            swap(matArray[i], matArray[i+1]);
        
        matArray.pop_back();
        matArray.push_back(finalOutputImage);
    

    currentFrameNumber++;
 

我对垫子的理解说这可能是指针的问题;我只是不确定如何解决它。当我查看垫子数组时,每个元素都是同一个框架。谢谢。

【问题讨论】:

如果要使用数组存储numberFrames最后一帧,为什么要使用else if(currentFrameNumber &lt;= numberFrames)?这将防止currentFrameNumber &gt; numberFrames 时发生任何事情,这将很快发生。所以我想说,无论视频有多长,您都只是存储第 1-6 帧(不包括 0)。 Mat 只是一个智能指针,您从捕获中获得的内容指向 static 内存。你想要的是:matArray.push_back(finalOutputImage.clone()); @Pafka 感谢您指出我的错字。它应该是一个大于号。仍然不能解决问题,但 berak 所说的可以。 @berak 谢谢,已经解决了。 【参考方案1】:

如果您要使用 C++ 非常有用的 STL,就不需要这么复杂。

if( currentFrameNumber >= numberFrames )
    matArray.remove( matArray.begin() );
matArray.push_back( finalOutputImage.clone() );     //check out @berak's comment

应该这样做。

【讨论】:

包含 .clone() 解决了它们都显示相同帧的问题。当我构建它时,我收到“无法解决删除”的错误。做了一点研究。需要使用的是 .erase 。感谢您帮助清理我的代码。 我不知道为什么会这样。看看这个:***.com/questions/19296958/…

以上是关于视频文件中的垫子数组 - opencv的主要内容,如果未能解决你的问题,请参考以下文章

通过引用传递一个垫子对象 OpenCv

使用opencv将视频写入文件时遇到问题

在实时视频中仅更改 Mat 的一部分 OpenCV Native C++ Android Studio

[OpenCV-Python] OpenCV 中的 Gui 视频

从opencv c ++中的视频文件中检索每第三帧

在 OpenCV 中使用 H.264 压缩编写视频文件