【问题标题】:segmentation fault in findcontours opencvfindcontours opencv中的分段错误
【发布时间】:2016-01-17 19:19:14
【问题描述】:

我正在尝试检测一个球并为其绘制边界。它显示错误

segmentation fault (core dumped)

错误就在这里,

vector<vector<Point> > contours;
    vector<Vec4i> hierarchy;

   Mat itt = Mat::zeros( imgThresholded.size(), CV_8UC1 );
itt = imgThresholded*255;

Canny( itt ,itt, 10, 30, 3 );
vector<vector<Point> > contours_poly( contours.size() );
vector<Point2f>center( contours.size() );
vector<float>radius( contours.size() );
vector<Rect> boundRect( contours.size() );
imshow("canny", itt);
//CIRCLE HOUGH
//vector<Vec3f> circles;
findContours( itt, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0) );
for( int i = 0; i < contours.size(); i++ )
     {
         Scalar color = Scalar(255,255,255);

       if( contours[i].size() > points )
       {approxPolyDP( Mat(contours[i]), contours_poly[i], 3, true );
      boundRect[i] = boundingRect( Mat(contours_poly[i]) );
       minEnclosingCircle( (Mat)contours_poly[i], center[i], radius[i] );
       circle( imgOriginal, center[i], (int)radius[i],color, 2, 8, 0 );
     }
     }

我不明白哪里有段错误。

【问题讨论】:

  • 我无法理解存在段错误的位置。 -- 如果出现问题,您还没有准备好调试您的应用程序吗?哪一行代码会产生分段错误?
  • for条件有问题,评论时没有问题。而且,没有评论它..它可以工作,但是当我把球带到屏幕上时,代码就会退出并显示这个段错误。 IE;如果检测到任何东西,代码就会停止。无法理解问题出在哪里
  • 如果findCountours 通过引用获取contours,并且在该函数中,它会删除或添加项目到countours 向量,那么您的其他向量没有适当地调整大小。
  • 您可能在发行版中使用调试库,反之亦然。或者混合 x86 和 x64 库。或者使用不同编译器编译的库
  • 先找到轮廓,然后声明中心、半径等参数。

标签: c++ opencv segmentation-fault contour


【解决方案1】:

在findContours之后声明其他向量,如下图。如需进一步参考,您可以查看here。希望这可以解决您的错误。我遇到了同样的错误,并在我提到的链接中得到了解决方案。

findContours( itt, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0) );
vector<vector<Point> > contours_poly( contours.size() );
vector<Point2f>center( contours.size() );
vector<float>radius( contours.size() );
vector<Rect> boundRect( contours.size() );

【讨论】:

    【解决方案2】:

    你先做 向量boundRect(contours.size()); 在这里,轮廓仍然是空的。 然后调用 findContours,它计算并设置轮廓的大小, 然后你尝试直接将它写入boundRect[i]。

    只需调用 boundRect.push_back(boundingRect( Mat(contours_poly[i]) ) );相反,那你应该没问题。

    如果您正在编写原型代码,通常最好使用 boundRect.at(i) = ... 进行调试,因为这会给您一个可以理解的错误,例如“超出范围”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-25
      • 2018-03-04
      • 1970-01-01
      • 1970-01-01
      • 2020-12-21
      • 1970-01-01
      • 1970-01-01
      • 2016-04-15
      相关资源
      最近更新 更多