findContours 中的分段错误

segmentation fault in findContours

我在 运行 期间遇到分段错误错误,以便下面的代码查找轮廓。我提到了 post on this form but didn't help me much. I got to know there are some issues with findContours This is another issue of 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)

我不知道 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()

之后声明(或调整)其他向量

p.s.: 对不起我的英语不好