【问题标题】:Segmentation fault in a vector<vector<Point> > in opencvopencv 中的向量<vector<Point> > 中的分段错误
【发布时间】:2013-11-05 09:55:37
【问题描述】:

我做了一小段代码,导致分段错误,但我不明白为什么。 希望大家能澄清一下。

代码:

   for(unsigned int i = 0; i < Objects.size(); i++)
   {

   if (Objects[i].size() > 10)
           Objects2[i] = Objects[i];
   }

对象被声明为向量 > 因为 opencv 函数 findContour()。

Gr!

【问题讨论】:

  • Objects2 的大小合适吗?你到底想做什么?可能有更简单的方法。
  • 此代码是较大代码的一部分,该代码应检测航拍图像中的人。我制作了一个 SalientMap 并在这张地图中找到了轮廓。现在我想在我找到的轮廓周围画一个边界框。
  • 问题是我发现像 100 个轮廓。有很多小轮廓。我需要删除小的。
  • 您提供的代码不足以重现问题。它可能在 Objects2 的初始化中。

标签: c++ opencv vector computer-vision


【解决方案1】:

让我猜猜。您没有将 Objects2 初始化为正确的大小,因此

Objects2[i] = Objects[i];

是越界访问。

你可以考虑

Objects2.push_back(Objects[i]);

【讨论】:

    【解决方案2】:

    由于下标运算符没有抛出异常,那么似乎分段错误的原因是语句

    Objects2[i] = Objects[i];
    

    你可以用它代替

    Objects2.at( i ) = Objects[i];
    

    并捕获异常以确定哪个索引无效。

    【讨论】:

      【解决方案3】:

      轮廓面积可以使用contourArea 计算。试试:

      for(int i = 0; i < Objects.size(); i++) {
          if (contourArea(Objects[i]) > 10) {            
              Objects.erase(Objects.begin() + i);
              i--;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-14
        • 2018-01-22
        • 2021-08-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-19
        • 2021-04-09
        相关资源
        最近更新 更多