尝试从多线程视频捕获访问帧时出错

时间:2017-11-09 09:04:24

标签: multithreading opencv segmentation-fault runtime-error

我正在使用ltbb从两台摄像头流式传输。 ltbb创建两个线程(因为两个摄像头),用于从两个摄像头同时进行流式传输。它利用并发队列来获取帧。以下代码段显示了框架:

while (waitKey(20) != 27)
  {
    //Retrieve frames from each camera capture thread
    vector<Mat> iMats(capture_source.size());

    for (int i = 0; i < capture_source.size(); i++)
    {
      Mat frame;

      //Pop frame from queue and check if the frame is valid
      if (cam.frame_queue[i]->try_pop(frame))
      {
        //Show frame on Highgui window
        // IMats.push_back(frame);
        iMats[i] = frame;
        imshow(label[i], frame);
      }

    } // end of for - loop

    int x = opencv_tri(iMats);
  }  

问题当我正在执行iMats[i] = frame并将其传递给其他函数时,它给了我一个错误。 当我评论iMats并停止调用opencv_tri(iMats)时,它工作正常。

错误:Segmentation fault (core dumped)

指向opencv_tri的链接: opencv_tri.cpp

任何人都可以解释并帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

不幸的是,我无法发表评论。 我认为你的矢量是空的,因此你无法访问[i]&#39;元素。

vector<Mat> iMats(capture_source.size());

这会使用capture_source.size()元素创建一个空Vector。

答案 1 :(得分:0)

我没有浏览你链接的整个opencv_tri函数,但我发现了可能的错误。

你有以下

for(int i = 0;i<imats.size();i+=2)
{

...

 Mat imgATest = imats[i];
 Mat imgBTest = imats[i+1];

i位于imats.size()-1时,它会尝试访问:

Mat imgBTest = imats[i+1];

这是一个出界。因为i + 1是imats.size()

您必须循环到imats.size()-1

for(int i = 0;i<imats.size()-1;i+=2)
{

这样它就不会尝试访问错误的值