2016-04-10 7 views
0

Ich versuche, Konturen zu finden und fünf Cluster damit zu machen. Ich habe die Konturen mit gefunden:Cluster mit Konturen, Android, OpenCV

Imgproc.findContours(bw.clone(), contours, hierarchy, Imgproc.RETR_TREE, Imgproc.CHAIN_APPROX_SIMPLE); 

Und ich möchte den KMeans Algorithmus verwenden, um die fünf Cluster zu machen. Aber ich weiß nicht, der Schritt zwischen der Funktion findContours und der Funktion kmeans.

Core.kmeans(samples32f, 5, labels, criteria, 1, Core.KMEANS_PP_CENTERS, centers); 

Der erste Parameter der Funktion kmeans ist eine Mat mit einem Float CvType und Punkten.

Wie kann ich die Konturen in Punkte umwandeln oder wie muss ich vorgehen?

P.S. Es gibt 15 Konturen für 15 Kreise.

+1

Was möchten Sie dann Cluster? Sie geben nicht nur die kmeans willkürlichen Längenkurven, sondern Merkmalsvektoren fester Größe. Es sei denn, Sie haben etwas besonderes für "Feature-Extraktion", dann ist hier ein Hinweis: affin-invariante Fourier-Deskriptoren. – mainactual

+0

Vielen Dank für die Antwort. Ich möchte die Kerne von 5 Würfeln zusammenfassen. –

+0

Vielleicht veröffentlichen Sie ein Beispielbild, auf dem Sie das gewünschte Ergebnis kommentieren? – mainactual

Antwort

0

Ich löste das Problem! Vielen Dank für Ihren Tipp.

Ich verstehe nicht, welchen Wert der erste Parameter des Kmeans-Algorithmus braucht.

Mit diesem Tutorial analysierte ich das Problem und finde den richtigen Weg.

Imgproc.findContours(bw.clone(), contours, hierarchy, Imgproc.RETR_TREE, Imgproc.CHAIN_APPROX_SIMPLE); 

    Mat samples32final = new Mat(contours.size(), 2, CvType.CV_32F, new Scalar(0)); 

    for (int j = 0 ; j<contours.size(); j++) { 
     Mat samples32f = new Mat((int) contours.get(j).size().height, 2, CvType.CV_32F, new Scalar(0)); 
     for (int i = 0; i < (int) contours.get(j).size().height; i++) { 
      samples32f.put(i, 0, contours.get(j).get(i, 0)[0]); 
      samples32f.put(i, 1, contours.get(j).get(i, 0)[1]); 
     } 

     samples32f.reshape((int) contours.get(j).size().height, 2); 

     Mat labels = new Mat((int) contours.get(j).size().height, 2, CvType.CV_32SC1); 
     TermCriteria criteria = new TermCriteria(TermCriteria.EPS + TermCriteria.MAX_ITER, 100, 1.0); 
     Mat centers = new Mat(); 
     Core.kmeans(samples32f, 1, labels, criteria, 10, Core.KMEANS_RANDOM_CENTERS, centers); 

     samples32final.put(j,0,centers.get(0,0)[0]); 
     samples32final.put(j,1,centers.get(0,1)[0]); 
    } 

    samples32final.reshape(contours.size(), 2); 

    Mat labels = new Mat(contours.size(), 2, CvType.CV_32SC1); 
    TermCriteria criteria = new TermCriteria(TermCriteria.EPS + TermCriteria.MAX_ITER, 100, 1.0); 
    Mat centers = new Mat(); 
    Core.kmeans(samples32final, 5, labels, criteria, 10, Core.KMEANS_PP_CENTERS, centers); 

In der ersten Zeile wurden die Konturen des Bildes gefunden. In der ersten for-Schleife findet die Mitte jedes Pip mit Clustergröße 1 und speichert das Zentrum in einer neuen Matte. Nach der for-Schleife wird die zentrale Position aller Pips in den variablen samples32final gespeichert. Mit dieser Variable kann die Mitte des Würfels mit Kmeans gefunden werden.

Entschuldigung für das schlechte Englisch ...