【问题标题】:Accessing Pointers in a Vector C++在 Vector C++ 中访问指针
【发布时间】: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


    【解决方案1】:

    Opencv 避免复制。 这个:

                VideoBuffer.push_back(new Mat(vidImg));
    

    不会复制vidImg中的数据,它只是创建一个新的头部,所以后面对vidImg中数据的更改会改变VideoBuffer的所有元素。使用 clone 方法复制数据。

    【讨论】:

      【解决方案2】:

      除了@etarion 所说的,让你的生活更轻松,丢弃所有这些指针,你根本不需要它们。

      class VecOfMats
      {
      public:
          explicit VecOfMats()
          {
              if(!vidDev.open(str))
              {
                  cout << "no file found" << endl;
                  return;
              }
              namedWindow("test load");
              loadVideoInBuffer();
              cout << "file loaded" << endl;
              namedWindow("test show");
              playVideoInBuffer();
          }
      
          ~VecOfMats()
          {
              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()
          {
              VideoBuffer.clear();
              currentVideoFrame = 0;
              while(true)
              {
                  if(vidDev.read(vidImg) == false)
                      break;
                  VideoBuffer.push_back(vidImg.clone());  // <-- here goes the clone() !
                  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++;
              }
          }
      };
      

      【讨论】:

      • 答案很简单。兴趣 ;) .
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-20
      • 1970-01-01
      相关资源
      最近更新 更多