【发布时间】:2013-12-03 12:34:24
【问题描述】:
我指的是question。因为我无法在那里回答,所以我提出了新的问题,并更好地挑选出我遇到的问题。
为此,我编写了一个可编译文件。
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace std;
using namespace cv;
class VecOfPointers
{
public:
explicit VecOfPointers()
{
if(!vidDev.open(str))
{
cout << "no file found" << endl;
return;
}
namedWindow("test load");
loadVideoInBuffer();
cout << "file loaded" << endl;
namedWindow("test show");
playVideoInBuffer();
}
~VecOfPointers()
{
for(unsigned int h = 0; h < VideoBuffer.size(); h++)
{
Mat* img = VideoBuffer[h];
delete img;
}
VideoBuffer.clear();
destroyAllWindows();
}
unsigned int currentVideoFrame = 0;
Mat vidImg;
VideoCapture vidDev;
const string str = "/home/Inge/DA/videos/testVideo.avi";
vector<Mat*> VideoBuffer;
void loadVideoInBuffer()
{
for(unsigned int h = 0; h < VideoBuffer.size(); h++)
{
Mat* img = VideoBuffer[h];
delete img;
}
currentVideoFrame = 0;
while(true)
{
if(vidDev.read(vidImg) == false)
break;
VideoBuffer.push_back(new Mat(vidImg));
vidImg = *(VideoBuffer[currentVideoFrame]);
waitKey(50);
imshow("test load",vidImg);
currentVideoFrame++;
cout << currentVideoFrame << endl;
}
}
void playVideoInBuffer()
{
currentVideoFrame = 0;
while(currentVideoFrame != VideoBuffer.size())
{
vidImg = *(VideoBuffer[currentVideoFrame]);
imshow("test show", vidImg);
waitKey(50);
cout << currentVideoFrame << endl;
currentVideoFrame++;
}
}
};
int main()
{
VecOfPointers testClass;
}
你可以下载here的测试视频。
我希望这能更好地解决我的问题。我将其总结如下:
- 我编写了一个类,它应该打开一个视频文件 (opencv-lib) 并播放它
- 视频帧存储在堆中,相应的指针保存在指针向量中,指向每一帧
- 保存在 loadVideoInBuffer() 方法中完成
- 播放在 playVideoInBuffer() 方法中完成
在我看来,这不应该有任何问题,但 show 方法确实只显示一帧,这是最后一帧。现在让我感到困惑的是,我在两个函数(加载和显示)中使用了完全相同的代码来播放 VideoBuffer 内容。在加载功能中,它按需要运行。
如果我以这种方式更改加载功能
void loadVideoInBuffer()
{
for(unsigned int h = 0; h < VideoBuffer.size(); h++)
{
Mat* img = VideoBuffer[h];
delete img;
}
while(true)
{
if(vidDev.read(vidImg) == false)
break;
VideoBuffer.push_back(new Mat(vidImg));
}
currentVideoFrame = 0;
while(currentVideoFrame != VideoBuffer.size())
{
vidImg = *(VideoBuffer[currentVideoFrame]);
waitKey(50);
imshow("test load",vidImg);
currentVideoFrame++;
cout << currentVideoFrame << endl;
}
}
它也只会显示最后一帧,我不知道为什么。
我希望我现在已经弄清楚了我在这篇文章顶部链接的最后一个问题中也遇到的问题。
我看到有问题,问题出在哪里,但不知道原因。看来,它写遍了其他指针。向量中的指针发生了什么,为什么它们都指向最后一个的内容,尽管我已经分配了新的空间?
提前致谢! 英格
到系统: OpenSuse 13.1 IdeQt5.0 与 gcc 4.8.1 OpenCV-2.4.7
根据项目文件
HEADERS +=
SOURCES += \
main.cpp
QMAKE_CXXFLAGS += -std=c++11
LIBS += `pkg-config opencv --cflags --libs`
【问题讨论】:
标签: c++ pointers opencv vector