2016-12-12 1 views
0

Ich verarbeite ein Video, das ich einige Objekte erkennen möchte.unerwünschte Konturen filtern - opencv mit C++

zuerst, ich entferne Hintergrund, dann mache es grau und mache ein Binärbild mit cv::threshold und danach cv::findcontours.

Ich möchte zu lange und zu kurze Konturen entfernen. Ich habe einen Code aus diesem Grund in "Opencv 2 Kochbuch" gefunden. Aber es hat einen Laufzeitfehler im 21. Frame meines Videos.

// Eliminate too short or too long contours 
    size_t cmin{ 15 }; // minimum contour length 
    size_t cmax{ 120 }; // maximum contour length 


    std::vector<std::vector<cv::Point> >:: 
     const_iterator itc = contours.begin(); 
    while (itc != contours.end()) { 
     if (itc->size() < cmin || itc->size() > cmax) 
      itc = contours.erase(itc); 
     else 
      ++itc; 
    } 

Ich suchte und einen anderen Code gefunden und es hat den gleichen Fehler auf dem gleichen Rahmen:

double min_area = 500; // area threshold 
    double max_area = 1500; // area threshold 
    for (int i = 0; i < contours.size(); i++) // iterate through each contour. 
    { 
     double area = contourArea(contours[i], false); // Find the area of contour 
     if (area < min_area || area > max_area) 
      contours.erase(contours.begin() + i); 
    } 

und ich schrieb einen Code, um einen neuen Vektor zu erstellen und nur in ihm die akzeptierten Konturen zu kopieren. aber es hat auch den gleichen Fehler auf dem gleichen Rahmen:

std::vector<std::vector<cv::Point> > goodcontours; 
    size_t cmin{ 15 }; 
    size_t cmax{ 120 }; 
    double contourlength = 1; 
    size_t contoursize = contours.size(); 
    for (int i = 0; i != contoursize;i++) { 
     contourlength = cv::arcLength(contours[i], true); 
     if (contourlength > cmin && contourlength < cmax) 
      goodcontours.push_back(contours.at(i)); 
    } 

ich andere Videos versucht, und alle von ihnen hat das gleiche Problem auf einem bestimmten Rahmen.

Vor dem Fehler kann ich immer noch die unerwünschten Konturen sehen und es bedeutet, dass sie nicht wirklich beseitigt werden.

der Fehler nur sagen:

Unbehandelte Ausnahme bei 0x75017FB2 (ucrtbase.dll)

Haben Sie zum Filtern der Konturen jeden Vorschlag?

one of my video frames contours

+1

ich ** ** raten, dass es mit der Kontur zu tun hat, nicht passende 'contourArea Annahmen (zu klein vielleicht?). Es muss eine detailliertere Info-Nachricht geben - schau genauer hin – slawekwin

Antwort

1

Einer meiner Freunde beantwortet meine Frage und ich werde es mit Ihnen geteilt:

cv::findContours(image,contours,CV_RETR_LIST,mode,cv::Point(offset_x,offset_y)); 

    for(int i=0;i<contours.size();i++) 
    { 
     AreaContour=cv::contourArea(contours[i]); 
     if(AreaContour<MaxAreaContour && AreaContour>MinAreaContour) 
     drawContours(Result,contours,i,cv::Scalar(DrawColor),Thickness,LineType,cv::noArray(),2147483647,cv::Point(DrawOffset_x,DrawOffset_y)); 

    } 
Verwandte Themen