Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 指针向量的访问元素_C++_Pointers_Opencv_Vector - Fatal编程技术网

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());
因此:

  • 删除所有指针(无论如何都不应该让它们是原始的),因为Mat已经是一个“句柄”类型的类
  • 使用
    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());