Не могу нарисовать самый большой контур

У меня есть следующий код для рисования самого большого контура. Но кажется, что-то я делаю не так. Пожалуйста посоветуй

if(inputImage.data == NULL)
        return HandInfo2();
        Mat outputImage =  Mat::zeros( inputImage.size(), CV_8UC1);
        vector<vector<Point> > contours;
        vector<Vec4i> hierarchy;
        vector<Point> largestContour;
        int largestArea = -1;

    findContours( inputImage, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0) );

    /// Approximate contours to polygons
    vector<vector<Point> > polyContours( contours.size() );
    
    for( int i = 0; i < contours.size(); i++ )
    { 
        approxPolyDP( Mat(contours[i]), polyContours[i], 3, true );
    }

    for( int i = 0; i < contours.size(); i++ )
    { 
        int area = fabs(contourArea(polyContours[i],false));
        if(area > largestArea && area > size)
        {
            largestArea = area;
            largestContour = polyContours[i];
        }   
    }

    Scalar color = Scalar( 255 );

    if(largestContour.size()>0)
    drawContours( outputImage, largestContour, 0, color, 1, 8, vector<Vec4i>(), 0, Point() );    

Когда вызывается drawContours(), я получаю следующую ошибку

Ошибка OpenCV: утверждение не удалось (i ‹ 0) в неизвестной функции, файл ..\..\..\src\opencv\modules\core\src\matrix.cpp, строка 957

ОШИБКА

Что я здесь делаю неправильно?


person Community    schedule 31.10.2012    source источник
comment
Здравствуйте, мне кажется, что вы можете оптимизировать это. Вместо циклического перебора контуров и сохранения самого большого в largestContour вы можете просто сохранить индекс самого большого контура, чтобы вам не приходилось копировать контуры несколько раз. Затем вы можете просто получить доступ к самому большому контуру в polyContours по его индексу... что вы думаете?   -  person Quentin Geissmann    schedule 01.11.2012


Ответы (1)


Хорошо, только для тех, кто делает ту же ошибку.

Мне понадобился vector<vector<Point>> largestContour; вместо векторного крупнейшего контура;

И изменил код с largestContour = polyContours[i]; на largestContour.push_back(polyContours[i]);

Вот оно. Теперь я могу извлечь самый большой контур.

person Community    schedule 01.11.2012