73 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Matlab
		
	
	
	
	
	
			
		
		
	
	
			73 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Matlab
		
	
	
	
	
	
#! /usr/bin/env octave
 | 
						|
cv;
 | 
						|
highgui;
 | 
						|
MAX_CLUSTERS=5;
 | 
						|
 | 
						|
function ret = randint(v1, v2)
 | 
						|
  ret = int32(rand() * (v2 - v1) + v1);
 | 
						|
end
 | 
						|
 | 
						|
color_tab = { \
 | 
						|
             CV_RGB(255,0,0), \
 | 
						|
             CV_RGB(0,255,0), \
 | 
						|
             CV_RGB(100,100,255), \
 | 
						|
             CV_RGB(255,0,255), \
 | 
						|
             CV_RGB(255,255,0)};
 | 
						|
img = cvCreateImage( cvSize( 500, 500 ), 8, 3 );
 | 
						|
rng = cvRNG(-1);
 | 
						|
 | 
						|
cvNamedWindow( "clusters", 1 );
 | 
						|
 | 
						|
while (true),
 | 
						|
  cluster_count = randint(2, MAX_CLUSTERS);
 | 
						|
  sample_count = randint(1, 1000);
 | 
						|
  points = cvCreateMat( sample_count, 1, CV_32FC2 );
 | 
						|
  clusters = cvCreateMat( sample_count, 1, CV_32SC1 );
 | 
						|
  
 | 
						|
  ## generate random sample from multigaussian distribution
 | 
						|
  for k=0:cluster_count-1,
 | 
						|
    center = CvPoint();
 | 
						|
    center.x = mod(cvRandInt(rng), img.width);
 | 
						|
    center.y = mod(cvRandInt(rng), img.height);
 | 
						|
    first = k*sample_count/cluster_count;
 | 
						|
    last = sample_count;
 | 
						|
    if (k != cluster_count)
 | 
						|
      last = (k+1)*sample_count/cluster_count;
 | 
						|
    endif
 | 
						|
 | 
						|
    point_chunk = cvGetRows(points, first, last);
 | 
						|
    
 | 
						|
    cvRandArr( rng, point_chunk, CV_RAND_NORMAL, \
 | 
						|
              cvScalar(center.x,center.y,0,0), \
 | 
						|
              cvScalar(img.width*0.1,img.height*0.1,0,0));
 | 
						|
  endfor
 | 
						|
  
 | 
						|
 | 
						|
  ## shuffle samples 
 | 
						|
  cvRandShuffle( points, rng );
 | 
						|
 | 
						|
  cvKMeans2( points, cluster_count, clusters, \
 | 
						|
            cvTermCriteria( CV_TERMCRIT_EPS+CV_TERMCRIT_ITER, 10, 1.0 ));
 | 
						|
 | 
						|
  cvZero( img );
 | 
						|
 | 
						|
  for i=0:sample_count-1,
 | 
						|
    cluster_idx = clusters(i);
 | 
						|
    pt = points(i);
 | 
						|
    cvCircle( img, pt, 2, color_tab{cluster_idx + 1}, CV_FILLED, CV_AA, 0 );
 | 
						|
 | 
						|
cvCircle( img, pt, 2, color_tab{cluster_idx + 1}, CV_FILLED, CV_AA, 0 );
 | 
						|
  endfor
 | 
						|
  
 | 
						|
 | 
						|
  cvShowImage( "clusters", img );
 | 
						|
 | 
						|
  key = cvWaitKey(0);
 | 
						|
  if( key == 27 || key == 'q' || key == 'Q' )
 | 
						|
    break;
 | 
						|
  endif
 | 
						|
endwhile
 | 
						|
 | 
						|
 | 
						|
cvDestroyWindow( "clusters" );
 |