2016-06-06 15 views
0

Ich habe Form, aus der ich Konturen extrahieren möchte (ich muss die Anzahl der Konturen rechts -zwei haben), aber in der Hierarchie bekomme ich 4 oder mehr statt zwei Konturen. Ich kann einfach nicht verstehen, warum, es ist offensichtlich und es gibt keinen Lärm, ich benutzte Diletation und Erosion vor.OpenCv findcontours() zu viele Konturen

before findcontours()

after findcontours()

Ich habe versucht, alle parametars, und nichts zu ändern. Auch ich habe versucht mit dem Bild des weißen Quadrats und hat nicht gearbeitet. Es gibt meine Zeile dafür:

Mat I = imread("test.png", CV_LOAD_IMAGE_GRAYSCALE); 
I.convertTo(B, CV_8U);  
findContours(B, contour_vec, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_NONE); 

Warum ist Kontur so getrennt Was tun, um 2 Konturen in der Hierarchie zu haben?

+2

Ich zähle 5 Konturen (2 externe und 2 interne und eine oben rechts). Das zweite Bild ist nur Müll, der von 'findContours' produziert wird. Benutze 'findContours (B.clone(), ...)', um 'B' zu vermeiden – Miki

Antwort

2

In Ihrem Bild befinden sich 5 Konturen: 2 Außenkonturen, 2 Innenkonturen und 1 oben rechts.

Sie können interne und externe Konturen verwerfen, wenn sie in CW oder CCW ausgerichtet sind. Sie können mit contourArea mit orientierten Flagge tun:

orientiert - Oriented Bereichflag. Wenn dies der Fall ist, gibt die Funktion abhängig von der Konturausrichtung (im oder gegen den Uhrzeigersinn) einen vorzeichenbehafteten Flächenwert zurück. Mit dieser Funktion können Sie die Ausrichtung einer Kontur bestimmen, indem Sie das Vorzeichen eines Bereichs verwenden. Standardmäßig ist der Parameter false, was bedeutet, dass der absolute Wert zurückgegeben wird.

So zeichnen Außenkonturen in rot und internen in grün erhalten Sie:

enter image description here

können Sie dann nur speichern Außenkonturen (siehe externalContours) im Code unten :

#include <opencv2\opencv.hpp> 
#include <vector> 

using namespace std; 
using namespace cv; 

int main() 
{ 
    // Load grayscale image 
    Mat1b B = imread("path_to_image", IMREAD_GRAYSCALE); 

    // Find contours 
    vector<vector<Point>> contours; 
    findContours(B.clone(), contours, RETR_TREE, CHAIN_APPROX_NONE); 

    // Create output image 
    Mat3b out; 
    cvtColor(B, out, COLOR_GRAY2BGR); 

    vector<vector<Point>> externalContours; 
    for (size_t i=0; i<contours.size(); ++i) 
    { 
     // Find orientation: CW or CCW 
     double area = contourArea(contours[i], true); 

     if (area >= 0) 
     { 
      // Internal contours 
      drawContours(out, contours, i, Scalar(0, 255, 0)); 
     } 
     else 
     { 
      // External contours 
      drawContours(out, contours, i, Scalar(0, 0, 255)); 

      // Save external contours 
      externalContours.push_back(contours[i]); 
     } 
    } 

    imshow("Out", out); 
    waitKey(); 

    return 0; 
} 

Bitte denken Sie daran, dass findContours das Bild beschädigt (das zweite Bild, das Sie zeigen, ist Müll). Übergeben Sie einfach einen Klon des Bildes an findContours, um Verfälschungen des ursprünglichen Bildes zu vermeiden.

+0

Danke, du hast mein Leben gerettet :) –

+0

Froh, dass es geholfen hat; D – Miki

Verwandte Themen