2016-04-10 21 views
0

Ben kontur bulmaya ve onunla beş küme yapmaya çalışıyorum. Birlikte hatlarını bulduk:küme, Android, OpenCV

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

Ve beş küme yapmak için kmeans algoritmasını kullanmak istiyorum. Ama bilmiyorum, findContours fonksiyonu ve kmeans fonksiyonu arasındaki adım.

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

Kmeans işlevinin ilk parametresi bir Float CvType ve noktaları olan bir Mat'dır.

Kontürleri nasıl noktaya dönüştürebilirim veya nasıl devam etmeliyim?

P.S. 15 daire 15 daireyi temsil eder.

+1

Peki, o zaman kümelemek istiyor musunuz? Sadece kilometrelerce keyfi uzunluk eğrilerini vermezsiniz, ancak sabit boyut özelliği vektörleri. "Özellik çıkarma" için özel bir fikriniz yoksa, işte burada bir ipucu: affine-invariant fourier descriptors. – mainactual

+0

Cevabınız için teşekkür ederiz. Ben 5 dices pipleri kümelemek istiyorum. –

+0

Belki de, istediğiniz sonucu eklediğiniz bir örnek resim gönderirsiniz? – mainactual

cevap

0

Problemi çözdüm! Bahşiş için ana konuya teşekkürler.

Kmeans algoritmasının ilk parametresinin hangi değere ihtiyaç duyduğunu anlamıyorum.

Bu Tutorial ile sorunu analiz ettim ve doğru yolu buldum.

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); 

İlk satırda görüntünün konturları bulundu. İlk döngüde, küme boyutu 1 olan her bir pipün merkezini bulur ve merkezini yeni bir Mat'ta depolar. For döngüsünden sonra tüm piplerin merkez pozisyonu değişken numunelerde32finalde saklanır. Bu değişken ile zarın ortası kmeans ile bulunabilir.

Kötü ingilizce için özür dilerim ...