寫教學的最大目的是教會未來的自己

openCV K-means的用法

最近為了去雜訊,測視使用了 k-means的方法減少,效果不錯,有效解決因為少數雜訊影響重心位置

參考資料

http://forum.gamer.com.tw/C.php?bsn=60292&snA=1518

http://www.aishack.in/2010/08/k-means-clustering-in-opencv/

http://rritw.com/a/bianchengyuyan/C__/20121123/258942.html

 

這三篇教學文當中,我使用第一篇的範力十分簡單好懂

第二篇視所有參數的英文說明

第三篇是中文說明

 

本文教學開始

 

    Mat model(Data.size(),2, CV_32F );//sample

//建立一個矩陣 每一筆資料 一個row,cow代表維度,這次我是算點作標 所以是二維

    vector<Point *>::iterator tempPoint; //事先算好的點陣列
    int i=0;

//把資料塞入矩陣中
    for(tempPoint=Data.begin();tempPoint!=Data.end();tempPoint++,i++)
    {
        model.at<float>(i,0)=(*tempPoint)->x;
        model.at<float>(i,1)=(*tempPoint)->y;
    }
    
    int k=2; //要分幾群
    Mat cluster; //會跑出結果,紀錄每個row 最後是分配到哪一個cluster
    int attempts = 2;//應該是執行次數
    Mat centers; //記錄那個cluster的值
    //使用k means分群
    kmeans(model, k, cluster,TermCriteria(CV_TERMCRIT_ITER|CV_TERMCRIT_EPS, 10, 1), attempts,KMEANS_PP_CENTERS,centers );

    //,TermCriteria(CV_TERMCRIT_ITER|CV_TERMCRIT_EPS, 10, 1),  這裡有三個參數,決定k-means何時結束,第二個參數是指迭代最大次數,第三個參數是精確度多少,第一個參數是指依照前兩個參數的哪一個為準,以範例中就是兩者都參照,以 or 的方式決定

 

 

//以下是因為我指是用這方法去雜訊,所以要找出最多點的地方
    int countMAX=0;
    int MAXIndex;
    int *tempSum =new int[k];
    memset(tempSum,0,sizeof(int)*k);
    for(int i=0;i<Data.size();i++)
    {
        tempSum[cluster.at(i,0)]++;
        if(tempSum[cluster.at(i,0)]>countMAX)
        {
            countMAX=tempSum[cluster.at(i,0)];
            MAXIndex=cluster.at<int>(i,0);
        }
    }
    Point result(centers.at<float>(MAXIndex, 0),centers.at<float>(MAXIndex, 1));

 

 

Post to Twitter Post to Plurk Post to Facebook Send Gmail

4 Responses to openCV K-means的用法

Leave a Reply

Copyright © 2024. All Rights Reserved.

歡迎光臨
初音