【问题标题】:segmentation fault in findContoursfindContours 中的分段错误
【发布时间】:2016-03-21 17:42:04
【问题描述】:

我在运行时遇到分段错误错误,以便下面的代码找到轮廓。我已经在此表格上推荐了this 帖子,但对我没有多大帮助。我知道findContours 有一些问题这是findContours 的另一个问题。请检查两个链接并帮助我解决此错误。我不知道为什么会出现分段错误错误。

 #include "opencv2/objdetect/objdetect.hpp"
 #include "opencv2/highgui/highgui.hpp"
 #include "opencv2/imgproc/imgproc.hpp"

 #include <iostream>
 #include <stdio.h>

 using namespace std;
 using namespace cv;

 string window_name = "Captured rectangle block";
 RNG rng(12345);
 double fps;
 int thresh = 100;

 int main( int argc, const char** argv )
 {
    VideoCapture cap("video.mp4"); // open the video file for reading
    if ( !cap.isOpened() )  // if not success, exit program
    {
         cout << "Cannot open the video file" << endl;
         return -1;
    }
    fps = cap.get(CV_CAP_PROP_FPS); //get the frames per seconds of the video
    cout << "Frame per seconds : " << fps << endl;
    double dWidth = cap.get(CV_CAP_PROP_FRAME_WIDTH);
    double dHeight = cap.get(CV_CAP_PROP_FRAME_HEIGHT);
    Size S(dWidth,dHeight);

    while(1)
    {

        Mat frame;
        Mat threshold_output;
        int skip_frame = 4;
        while(skip_frame)
        {
            printf("inside while loop\n");
            bool bSuccess = cap.read(frame); // read a new frame from video
            skip_frame--;
            if (!bSuccess) //if not success, break loop
            {
                cout << "Cannot read the frame from video file" << endl;
                break;
            }
        }

        //-- 3. Apply the classifier to the frame
        if( frame.empty() )
        { printf(" --(!) No captured frame -- Break!"); break; }

        std::vector<Rect> faces;
        Mat frame_gray;

        cvtColor( frame, frame_gray, CV_BGR2GRAY );
        equalizeHist( frame_gray, frame_gray);

        vector<vector<Point> > contours;
        vector<Vec4i> hierarchy;
        vector<vector<Point> > contours_poly( contours.size() );
        vector<Rect> boundRect( contours.size() );
        vector<Point2f>center( contours.size() );
        vector<float>radius( contours.size() );
        printf("before finding countrs\n");
        threshold( frame_gray, threshold_output, thresh, 255, THRESH_BINARY );
        findContours( threshold_output, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0));

        contours.resize(contours.size());
        printf("after finding countrs\n");
        for( unsigned int i = 0; i < contours.size(); i++ )
        {   
            printf("inside for loop\n");
            approxPolyDP( Mat(contours[i]), contours_poly[i], 3, true );
            printf("after poly\n");
            boundRect[i] = boundingRect( Mat(contours_poly[i]) );
            printf("after bondrec\n");
            minEnclosingCircle( (Mat)contours_poly[i], center[i], radius[i] );
        }
        Mat drawing = Mat::zeros( threshold_output.size(), CV_8UC3 );
        for( unsigned int i = 0; i< contours.size(); i++ )
        {
            Scalar color = Scalar( rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255) );
            drawContours( drawing, contours_poly, i, color, 1, 8, vector<Vec4i>(), 0, Point() );
            rectangle( drawing, boundRect[i].tl(), boundRect[i].br(), color, 2, 8, 0 );
            circle( drawing, center[i], (int)radius[i], color, 2, 8, 0 );
        }

        /// Show in a window
        namedWindow( "Contours", CV_WINDOW_AUTOSIZE );
        imshow( "Contours", drawing );
        int c = waitKey(10);
        if( (char)c == 'c' ) { break; }
    }
    return 0;
 }

错误:

Frame per seconds : 15
inside while loop
inside while loop
inside while loop
inside while loop
before finding countrs
after finding countrs
inside for loop
Segmentation fault (core dumped)

【问题讨论】:

  • 您应该尝试使用 gdb 对其进行调试,并找出导致分段错误的行,然后您将能够更轻松地修复它。虽然我认为这是因为您正在索引 contours_poly[i] 而它还没有被填充(它是空的)
  • @Wajahat 我进行了 GDB 调试并得到以下结果。 Program received signal SIGSEGV, Segmentation fault. 0xb7b4534b in cv::_OutputArray::create(int, int const*, int, int, bool, int) const () from /usr/local/lib/libopencv_core.so.3.1

标签: c++ segmentation-fault object-detection opencv-contour


【解决方案1】:

我不知道 openCv,但是...我想您的 contour 向量是由 findContours() 提供的。

所以,如果我没记错的话,请指教

vector<vector<Point> > contours;

创建一个零元素的向量;以下说明

vector<vector<Point> > contours_poly( contours.size() );
vector<Rect> boundRect( contours.size() );
vector<Point2f>center( contours.size() );
vector<float>radius( contours.size() );

创建其他零元素向量(contours.size() 为零)。

然后findContours() 被调用并contours 改变大小。

下面的指令没用

contours.resize(contours.size());

但真正的问题从这里开始

approxPolyDP( Mat(contours[i]), contours_poly[i], 3, true );

当您尝试访问零大小向量的第一个元素时 (contours_poly)

建议:调用findContours()后声明(或调整大小)其他向量

ps:对不起,我的英语不好

【讨论】:

  • 非常感谢。它帮助了我。
  • @predeep:一点也不。
猜你喜欢
  • 1970-01-01
  • 2018-03-09
  • 2016-06-25
  • 2018-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-21
  • 2019-01-12
相关资源
最近更新 更多