<span style="font-size:18px;">#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main(int argc, char** argv)
{
#define MAX_CLUSTERS 5
CvScalar color_table[MAX_CLUSTERS];
IplImage* img = cvCreateImage(cvSize(500,500),8,3);
cvNamedWindow("source", 1);
cvShowImage("source", img);
cvWaitKey(0);
CvRNG rng = cvRNG(0xffffffff);
color_table[0] = CV_RGB(255,0,0);
color_table[1] = CV_RGB(0,255,0);
color_table[2] = CV_RGB(0,0,255);
color_table[3] = CV_RGB(255,0,255);
color_table[4] = CV_RGB(255,255,0);
cvNamedWindow("clusters", 1);
while(true)
{
int k, cluster_count = cvRandInt(&rng)%MAX_CLUSTERS + 1;
int i, sample_count = cvRandInt(&rng)%1000 + 1;
CvMat* points = cvCreateMat(sample_count,1,CV_32FC2);
CvMat* clusters = cvCreateMat(sample_count,1,CV_32SC1);
//高斯分布产生随机点
for (k = 0; k < cluster_count; k++)
{
CvPoint center;
CvMat point_chunk;
center.x = cvRandInt(&rng)%img->width;
center.y = cvRandInt(&rng)%img->height;
cvGetRows(points, &point_chunk, k*sample_count/cluster_count,
k == cluster_count - 1 ? sample_count:(k+1)*sample_count/cluster_count);
cvRandArr(&rng,&point_chunk,CV_RAND_NORMAL,cvScalar(center.x,center.y,0,0),
cvScalar(img->width/6, img->height/6,0,0));
}
for(i = 0; i < sample_count/2; i++)
{
CvPoint2D32f* pt1 = (CvPoint2D32f*)points->data.fl + cvRandInt(&rng)%sample_count;
CvPoint2D32f* pt2 = (CvPoint2D32f*)points->data.fl + cvRandInt(&rng)%sample_count;
CvPoint2D32f temp;
CV_SWAP(*pt1,*pt2, temp);
}
cvKMeans2(points,cluster_count,clusters,cvTermCriteria(CV_TERMCRIT_EPS + CV_TERMCRIT_ITER,10, 1.0));
cvZero(img);
for(i = 0; i < sample_count; i++ )
{
CvPoint2D32f pt = ((CvPoint2D32f*)points->data.fl)[i];
int cluster_idx = clusters->data.i[i];
cvCircle(img, cvPointFrom32f(pt), 2, color_table[cluster_idx], CV_FILLED);
}
cvReleaseMat(&points);
cvReleaseMat(&clusters);
cvShowImage("clusters", img);
if(cvWaitKey(0) == 27) //'ESC'
break;
}
return 0;
}</span>