【发布时间】: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 <= numberFrames){?这将防止currentFrameNumber > numberFrames时发生任何事情,这将很快发生。所以我想说,无论视频有多长,您都只是存储第 1-6 帧(不包括 0)。 -
Mat 只是一个智能指针,您从捕获中获得的内容指向 static 内存。你想要的是:
matArray.push_back(finalOutputImage.clone()); -
@Pafka 感谢您指出我的错字。它应该是一个大于号。仍然不能解决问题,但 berak 所说的可以。
-
@berak 谢谢,已经解决了。