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
if(tempSum[cluster.at
{
countMAX=tempSum[cluster.at
MAXIndex=cluster.at<int>(i,0);
}
}
Point result(centers.at<float>(MAXIndex, 0),centers.at<float>(MAXIndex, 1));
tempSum[cluster.at(i,0)]++;
改成 tempSum[cluster.at(i,0)]++;
喔… 留言板似乎會把大於小於符號吃掉,這樣留言看不到我改了什麼… 不過倒數第四行那個才是對的 可能你的也被吃掉了
謝謝
可能吧
我好幾年沒碰了
我現在再寫PHP