C++ 指针向量的访问元素
我有一个复杂的问题。我会尽力解释我做了什么。 我有一个大班,班上有很多学生C++ 指针向量的访问元素,c++,pointers,opencv,vector,C++,Pointers,Opencv,Vector,我有一个复杂的问题。我会尽力解释我做了什么。 我有一个大班,班上有很多学生 Mat vidImg vector<Mat*> *VideoBuffer; unsigned int currentVideoFrame; 在这里,我将从另一个文件加载的一些对象加载到Videobuffer向量中。 如果我尝试从另一个类成员(我在这里分配)中的这个向量再次加载它: void grabAndProcessFrameVideo() // reload and show loaded inage
Mat vidImg
vector<Mat*> *VideoBuffer;
unsigned int currentVideoFrame;
在这里,我将从另一个文件加载的一些对象加载到Videobuffer向量中。
如果我尝试从另一个类成员(我在这里分配)中的这个向量再次加载它:
void grabAndProcessFrameVideo() // reload and show loaded inage
{
if(vidFlag == true)
{
vidImg = Mat(*(VideoBuffer[currentVideoFrame])); // load from vector
currentVideoFrame++; // inc index for vector
imshow("img",vidImg); // show reloaded object in another window
}
}
Mat对象和imshow函数来自opencv库,但我认为这并不重要。我的问题是,它只显示最后一张图像。如果我试图以这种方式直接在加载函数中访问buffervector
void EAMViewer::loadVideoInBuffer(int num)
{
ui->tbVideo->setDisabled(true);
VideoBuffer.clear();
currentVideoFrame = 0;
if(vidDev.open(ListVideos.at(num).absoluteFilePath().toStdString()) == false)
{
newLineInText(tr("no Device found"));
return;
}
while(true)
{
if(vidDev.read(vidImg) == false)
break;
VideoBuffer.push_back(new Mat(vidImg));
imshow("img",Mat(*(VideoBuffer)[currentVideoFrame]));
waitKey(30);
currentVideoFrame++;
}
currentVideoFrame = 0;
ui->tbVideo->setEnabled(true);
}
然后它显示了我想要的。所以我认为如果我停留在范围内,向量指针星座是有问题的
我现在的问题是:
1.为什么程序在抓取和处理时不会崩溃?
2.我能做些什么,防止删除
提前感谢,
Inge是否有调用grabAndProcessFrameVideo()的循环,以便显示所有图像
可能是因为它显示了你所有的图像,但速度非常快,所以你只能看到最后一张?如果是这样的话,像loadVideoInBuffer()(waitKey(30);)中那样添加一个暂停,您应该会看到所有的图像。我认为这可能是因为您正在解引用向量,而向量是指向向量的指针,而不是向量,而不是它实际包含的元素 也许试着换一下
vector<Mat*> *VideoBuffer;
到
在较低的while循环中,之所以只显示最后一帧,是因为
Mat
是一个引用计数类。所以当你做类似的事情时
Mat vidImg;
vidDev.read(vidImg);
Mat* a = new Mat(vidImg);
a和vidImg指向同一图像。因此,向量中的所有元素都指向同一个(上次加载的)图像。您要做的是:
Mat a = vidImg.clone();
或者在您的情况下(删除指针,因为它们不应该在那里:))
矢量视频缓冲区;
VideoBuffer.push_back(vidImg.clone());
因此:
clone()
方法复制图像数据李>
如果grabAndProcessFrameVideo没有显示好的帧,那是因为当前的视频帧索引不正确。不要在这里增加它(你没有“推回”向量中的新指针)嗨,Manuel,在哪个函数中我没有添加指向向量的指针?IngeI很惊讶这段代码可以正常工作,因为VideoBuffer是一个指针,所以您需要执行VideoBuffer->push_back。。。此外,上述代码似乎并未实际创建新向量,即没有VideoBuffer=新向量。在任何情况下,您都不希望使用指向像这样的向量的指针。只要在.clear()之前删除每个ptr,就可以使用vector类型的成员变量。修复你发布的源代码。vector*VideoBuffer不是矢量,它是指向矢量的指针。void grabAndProcessFrameVideo()不是类成员,它是独立的func。使用Mat(*(视频缓冲区[currentVideoFrame]);不管怎样,我不明白泄漏怎么会导致在你想要第一帧的时候显示最后一帧。同样,如果您看到最后一个,可能是因为currentVideoFrame不是0,也可能是因为您将所有帧存储在第一个索引中。查看当前视频帧的使用情况。写入
Mat(*VideoBuffer[n])
没有意义,取消引用元素的结果已经是一个Mat
对象,因此您可以说*VideoBuffer[n]
不会。grabAndProcessFrameVideo是一个插槽函数,在计时器停止运行后调用。所以这不是问题所在。但是谢谢,我换了括号。它也不起作用。关于指向向量的指针,我也考虑过。我想知道的是,作为类成员的其他堆栈变量也会被删除。指向向量的指针也会出现同样的问题。成员的记忆结构将是相同的。也许智能指针就是解决方案。你能简短地告诉我那是什么吗?谢谢
imshow("img",Mat(*(VideoBuffer)[currentVideoFrame]));
imshow("img",Mat(*VideoBuffer[currentVideoFrame]));
Mat vidImg;
vidDev.read(vidImg);
Mat* a = new Mat(vidImg);
Mat a = vidImg.clone();
vector<Mat> VideoBuffer;
VideoBuffer.push_back(vidImg.clone());