本人刚接触opencv,对于一张已处理过的黑白图像(白色像素集中在5、6个区域范围),需要进行聚类,并且用矩形圈出每个分类。我看到opencv中有K均值算法(http://www.opencv.org.cn/index.php/Cxcore%E5%85%B6%E5%AE%83%E6%B7%B7%E5%90%88%E5%87%BD%E6%95%B0),因此自己改了一下。但是总达不到预期结果,希望大家帮帮忙!问题解决我还会追加分!!
代码如下:
#include "stdafx.h"
#include <cv.h>
#include <highgui.h>
#include <stdio.h>
#include "cxcore.h"
#include "highgui.h"
int main( int argc, char** argv )
{
#define MAX_CLUSTERS 5
CvScalar color_tab[MAX_CLUSTERS];
color_tab[0] = CV_RGB(255,0,0);
color_tab[1] = CV_RGB(0,255,0);
color_tab[2] = CV_RGB(100,100,255);
color_tab[3] = CV_RGB(255,0,255);
color_tab[4] = CV_RGB(255,255,0);
IplImage *src=cvLoadImage("d:\\test5.jpg",1);
int wid=src->width;
int hei=src->height;
int cluster_count=5;
int sample_count=0;
cvNamedWindow( "clusters", 1 );
IplImage *img =cvCreateImage( cvGetSize(src), IPL_DEPTH_32F, 3 );
cvConvertScale(src, img); //使用线性变换转换数组
for(int i=0;i<wid;i++)
{
for(int j=0;j<hei;j++)
{
if(src->imageData[i*wid+j]==-1)
{
sample_count++;
}
}
}
for(;;)
{
CvMat* clusters = cvCreateMat( sample_count, 1, CV_32SC1 );
CvMat t_points = cvMat( sample_count,1, CV_32FC3,img->imageData);
CvMat *points = &t_points;
cvKMeans2( points, cluster_count, clusters,cvTermCriteria( CV_TERMCRIT_EPS+CV_TERMCRIT_ITER, 5, 1.0 ));
cvZero( img );
for( int i1 = 0; i1 < sample_count; i1++ )
{
CvPoint2D32f pt = ((CvPoint2D32f*)points->data.fl)[i1];
int cluster_idx = clusters->data.i[i1];
cvCircle( img, cvPointFrom32f(pt), 2, color_tab[cluster_idx], CV_FILLED );
}
cvShowImage( "clusters", img );
int key = cvWaitKey(0);
if( key == 27 ) // 'ESC'
break;
}
}
求高手解决!谢谢!!