gpt4 book ai didi

c++ - 在 Vector C++ 中访问指针

转载 作者:行者123 更新时间:2023-11-28 00:37:27 24 4
gpt4 key购买 nike

我指的是这个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) 并播放它
  • 视频帧存储在堆中,相应的指针保存在指向每一帧的指针 vector 中
  • 保存是在 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;
}
}

它也只会显示最后一帧,我不知道为什么。

我希望我现在已经解决了我在本文顶部链接的最后一个问题中遇到的问题。

我看到有问题,问题出在哪里,但不知道原因。看起来,它覆盖了所有其他指针。 vector 中的指针发生了什么,为什么它们都指向最后一个的内容,尽管我已经分配了新的空间?

提前致谢!英格

对系统:OpenSuse 13.1IdeQt5.0 与 gcc 4.8.1OpenCV-2.4.7

根据项目文件

HEADERS +=

SOURCES += \
main.cpp
QMAKE_CXXFLAGS += -std=c++11
LIBS += `pkg-config opencv --cflags --libs`

最佳答案

Opencv 避免复制。这个:

            VideoBuffer.push_back(new Mat(vidImg));

不复制 vidImg 中的数据,它只是创建一个新的 header ,因此以后对 vidImg 中数据的更改会更改 VideoBuffer 中的所有元素。使用克隆方法复制数据。

关于c++ - 在 Vector C++ 中访问指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20351351/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com