OpenCV K均值处理人脸图像时的问题

本人刚接触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;

}
}
求高手解决!谢谢!!

我觉得可以。Kmeans算法应用比较广泛,不过你需要把像素值转换成它需要的参数。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-03-13
人脸提取用Kmeans方法不好吧?
你先用肤色试试
第2个回答  2011-03-14
这里用k均值方法确实效果不好
相似回答