#include "cxcore.h"
#include "highgui.h"
#include <iostream>
#include <time.h>
#include <vector>
#include <iomanip>
#pragma comment(lib,"cxcore.lib")
#pragma comment(lib,"highgui.lib")
using namespace std;
struct Pattern
{
int x;
int y;
};
struct CenterPattern
{
float x;
float y;
};
int Classify(Pattern pn1,const CenterPattern CenterPatterns[],int isampleclass);
void GetClusterCenter(vector<Pattern> parr, CenterPattern &NewCenterPattern1);
void main(void)
{
//Temp Variable
int i,j;
//sample Class
int iSampleClass;
//Sample Number
int iSampleNum;
//Iterations
int iIteration = 0;
//the Origin Patterns
IplImage *pImgOriPatterns = NULL;
//the Image to show the Result;
IplImage *pImgResult = NULL;
//input the number of sample class
cout<<"Please input the number of sample class(2-50): ";
cin>>iSampleClass;
while(iSampleClass<2 || iSampleClass > 50)
{
cout<<" the number of sample class ranges from 2 to 50!!!"<<endl;
cout<<"Please input the number of sample class(2-50): ";
cin>>iSampleClass;
}
//input the number of sample
cout<<"Please input the number of sample(10-10000): ";
cin>>iSampleNum;
while(iSampleNum < 10 || iSampleNum > 10000)
{
cout<<" the number of sample ranges from 10 to 10000!!!"<<endl;
cout<<"Please input the number of sample(10-10000) : ";
cin>>iSampleNum;
}
//generate random patterns
Pattern *patterns = new Pattern[iSampleNum];
srand( (unsigned)time( NULL ) );
for( i = 0; i < iSampleNum;i++ )
{
patterns[i].x = rand()%200;
patterns[i].y = rand()%200;
// cout<<"patterns[i].x = " <<setw(3)<<patterns[i].x<< " patterns[i].y = " <<setw(3)<<patterns[i].y<<endl;
}
//Central Patterns
CenterPattern *OldCenterPatterns = new CenterPattern[iSampleClass];
CenterPattern *NewCenterPatterns = new CenterPattern[iSampleClass];
//initialize the Central Patterns
for (j = 0; j < iSampleClass; ++j)
{
OldCenterPatterns[j].x = static_cast<float>(patterns[j].x);
OldCenterPatterns[j].y = static_cast<float>(patterns[j].y);
}
// create iSampleClass containers to store different of patterns
vector<Pattern> *pArray = new vector<Pattern>[iSampleClass];
bool iterFlag = true;
int index;
//start to cluster
while(iterFlag && (iIteration < 200) )
{
++iIteration;
//empty the pArray
for (j = 0; j < iSampleClass; ++j)
{
if (!pArray[j].empty())
{
pArray[j].clear();
}
}
for ( i = 0; i < iSampleNum ; ++i)
{
// get the class index of each pattern
index = Classify(patterns[i],OldCenterPatterns,iSampleClass);
pArray[index].push_back(patterns[i]);
}
//get the new cluster center
for (i = 0; i < iSampleClass; ++i)
{
GetClusterCenter(pArray[i],NewCenterPatterns[i]);
}
iterFlag = false;
for (i = 0; i < iSampleClass; ++i)
{
if (NewCenterPatterns[i].x != OldCenterPatterns[i].x ||NewCenterPatterns[i].y != OldCenterPatterns[i].y)
{
//store the new Center Patterns
OldCenterPatterns[i].x = NewCenterPatterns[i].x;
OldCenterPatterns[i].y = NewCenterPatterns[i].y;
iterFlag = true;
}
}
}
cout<<"the number of iterations is :" <<iIteration<<endl;
cout<<"finish cluster!!!"<<endl;
pImgOriPatterns = cvCreateImage(cvSize(600,600),IPL_DEPTH_8U,1);
pImgResult = cvCreateImage(cvSize(600,600),IPL_DEPTH_8U,3);
cvZero(pImgOriPatterns);
cvZero(pImgResult);
//paint the patterns in the original image
for (i = 0; i < iSampleNum; ++i)
{
cvRectangle(pImgOriPatterns,cvPoint( patterns[i].x*3, patterns[i].y*3),
cvPoint( patterns[i].x*3+2, patterns[i].y*3+2 ),CV_RGB(255,255,255),CV_FILLED,8,0);
}
//generate the color table
CvScalar *pColorTable =new CvScalar[iSampleClass];
for (i = 0; i < iSampleClass; ++i)
{
pColorTable[i].val[0] = 255 / ( rand()%iSampleClass+1);
pColorTable[i].val[1] = 255 / ( rand()%iSampleClass+1);
pColorTable[i].val[2] = 255 / ( rand()%iSampleClass+1);
}
//paint the result of cluster
for (i = 0; i < iSampleClass; ++i)
{
for (vector<Pattern>::iterator iter1 = pArray[i].begin(); iter1 != pArray[i].end(); ++iter1)
{
cvRectangle(pImgResult,cvPoint( (*iter1).x*3, (*iter1).y*3 ),
cvPoint( (*iter1).x*3+2, (*iter1).y*3+2 ),pColorTable[i],CV_FILLED,8,0);
}
CvPoint CentralPoint;
CentralPoint.x = static_cast<int>(NewCenterPatterns[i].x*3);
CentralPoint.y = static_cast<int>(NewCenterPatterns[i].y*3);
cvCircle(pImgResult,CentralPoint,3,CV_RGB(255,255,255),CV_FILLED,8,0);
}
cvNamedWindow("Origin",1);
cvShowImage("Origin",pImgOriPatterns);
cvNamedWindow("Result",1);
cvShowImage("Result",pImgResult);
cvWaitKey(0);
cvDestroyAllWindows();
cvReleaseImage(&pImgOriPatterns);
cvReleaseImage(&pImgResult);
delete []patterns;
delete []pArray;
delete []OldCenterPatterns;
delete []NewCenterPatterns;
delete []pColorTable;
}
//Func
// Classify()
//Parameter
// Pattern pn1 --the pattern to be classified
// CenterPattern CenterPatterns[] --the CenterPatterns
// int isampleclass --the number of the sample class
//return
// the class index of the pn1
int Classify(Pattern pn1,const CenterPattern CenterPatterns[],int isampleclass)
{
float MinDist = 1000000000;
float Dist;
int index1;
for (int i = 0; i < isampleclass; ++i)
{
Dist = static_cast<float>((pn1.x - CenterPatterns[i].x)*(pn1.x - CenterPatterns[i].x) +
(pn1.y - CenterPatterns[i].x)*(pn1.x - CenterPatterns[i].y));
if (MinDist > Dist)
{
MinDist = Dist;
index1 = i;
}
}
return index1;
}
//Func
// GetClusterCenter()
//Parameter
// vector<Pattern> parr --the pattern to be classified
// Pattern & NewCenterPattern1 --the CenterPatterns
//Return value
// NULL
//Description
// ********************
void GetClusterCenter(vector<Pattern> parr, CenterPattern & NewCenterPattern1)
{
float SumX = 0, SumY = 0;
for (vector<Pattern>::iterator iter1 = parr.begin(); iter1 != parr.end(); ++iter1)
{
SumX += (*iter1).x;
SumY += (*iter1).y;
}
NewCenterPattern1.x = SumX * 1.0 / parr.size();
NewCenterPattern1.y = SumY * 1.0 / parr.size();
}
用opencv写的k均值聚类的VC++代码
4星 · 超过85%的资源 需积分: 9 26 浏览量
2012-11-29
13:03:33
上传
评论 4
收藏 3.52MB RAR 举报
caohuamei01
- 粉丝: 30
- 资源: 9
最新资源
- 同态加密python.zip
- 基于Python的PCA人脸识别算法的原理及实现代码详解+源码+详细代码解析+开发文档+数据(毕业设计&课程设计&项目开发)
- Decision tree20240105(1).ipynb
- zuoyezuoyezuoye
- zuoyezuoyezuoye
- 机械设计电机转子装配设备sw22非常好的设计图纸100%好用.zip
- 作业作业作业作业作业作业
- xdotool.c
- RLMD鲁棒性局部均值分解信号分量可视化(Matlab完整源码和数据)
- Screenshot_2024-04-26-17-17-26-36_9d26c6446fd7bb8e41d99b6262b17def.jpg
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
- 1
- 2
- 3
前往页