OpenCV: Kmeans的使用一维和二维点集

原创 2017年08月19日 23:28:13

OpenCVKmeans算法默认使用了Kmeans++选取种子点

参考:OpenCv中Kmeans算法实现和使用

//效果:根据半径聚类,并不一定能得到好的结果。
float CBlotGlint::ClusterByR(  )
{
	//根据半径大小聚类,找出合适的类别个数和每一类的个数
	std::vector<float>   radiuses(this->blobs.size() );
	std::vector<std::pair<float,int> >   radiusesIdx(this->blobs.size() );
	for ( int i=0; i< this->blobs.size(); ++i ){
		radiuses[i] =this->blobs[i].diaGlint;
		radiusesIdx[i].first  = radiuses[i];
		radiusesIdx[i].second = i;
	}

	{
		using namespace cv;

		this->blobs[0].diaGlint;

		const int MAX_CLUSTERS = 5;
		Scalar colorTab[] =
		{
			Scalar(0, 0, 255),
			Scalar(0,255,0),
			Scalar(255,100,100),
			Scalar(255,0,255),
			Scalar(0,255,255)
		};

		Mat img( 500, 500, CV_8UC3 );
		RNG rng( 12345 );
		std::vector<std::vector<float> >  outC;
		std::vector<std::vector<std::pair<float,int> > >  outCidx;

		{
			outC.clear();
			int k;
			int clusterCount = rng.uniform(2, MAX_CLUSTERS+1);
			int i;
			int sampleCount =radiuses.size();// rng.uniform(1, 1001);
			Mat points(sampleCount, 1, CV_32FC1), labels;
			for ( int i=0; i< sampleCount; ++i ){
				points.at<float>(i) = radiuses[i];
			}

			clusterCount = MIN(clusterCount, sampleCount);
			clusterCount = std::max(clusterCount,3);
			clusterCount = 3;

			Mat centers;
			kmeans(points, clusterCount, labels,
				TermCriteria( CV_TERMCRIT_EPS+CV_TERMCRIT_ITER, 10, 1.0),
				3, KMEANS_PP_CENTERS, centers);

			outC.resize( clusterCount );
			outCidx.resize( clusterCount );

			img = Scalar::all(0);
			for( i = 0; i < sampleCount; i++ )
			{
				int clusterIdx = labels.at<int>( i );
				outC[clusterIdx].push_back( points.at<float>( i  ) );
				outCidx[clusterIdx].push_back( 
					std::make_pair ( points.at<float>( i  ) ,radiusesIdx[i].second ) );

				Point ipt = this->blobs[i].centerOfGlint;
				circle( img, ipt, 2, colorTab[clusterIdx], CV_FILLED, CV_AA );
			}

			cv::imshow("clusters", img);

			char key = (char)cv::waitKey(1);
		}

		return 0;

	}

	return 1.0;
}

即使如此,每次聚类的效果仍然不一定相同,显示一定的随机性。



K-means算法实战-一维数据的聚类

用户有个开关,可以记录用户每次开关灯的状态,并且能够记录开关灯前后的光敏值。一般用户每天开灯时间集中在晚上,关灯时间也基本集中在晚上,但是有一些异常值,比如起夜上厕所开灯、上完厕所再关灯。获取用户开关...
  • qq_16583687
  • qq_16583687
  • 2017年08月01日 15:24
  • 1194

opencv中的Kmeans使用示例

kmeans是非常经典的聚类算法,至今也还保留着较强的生命力,图像处理中经常用到kmeans算法或者其改进算法进行图像分割操作,在数据挖掘中kmeans经常用来做数据预处理。opencv中提供了完整的...
  • owen7500
  • owen7500
  • 2016年06月07日 17:20
  • 5161

机器学习公开课笔记(8):k-means聚类和PCA降维

http://www.cnblogs.com/python27/p/MachineLearningWeek08.html K-Means算法 非监督式学习对一组无标签的数据试图...
  • zdy0_2004
  • zdy0_2004
  • 2016年01月20日 21:52
  • 2953

一种基于OpenCV的三维重建实现方案

一种基于OpenCV的三维重建实现方案 来源:淘金者论文范文 作者:Www.TaoJz.Com 日期:08/30/09 摘 要 本文以计算机视觉三维重建技术为研究对象,分析了开放计...
  • zkl99999
  • zkl99999
  • 2015年09月11日 14:06
  • 5486

使用new和vector实现一维和二维数组

new vector 一维和二维数组
  • duan19920101
  • duan19920101
  • 2016年03月27日 15:17
  • 1982

最接近点对,一维和二维情况

//最接近点对 一维情况 package wkx; import java.io.IOException; import java.util.ArrayList; import java.util...
  • Jack_Wong2010
  • Jack_Wong2010
  • 2012年05月17日 18:27
  • 638

python实现Kmeans文本聚类,通过PCA降维和Matplotlib显示聚类3d三维图像

在此基础上,主要实现以下改进及结果 1.替换使用sklearn.feature_extraction.text.TfidfVectorizer,将corpus文本转换为tfidf值的svm向量。 2....
  • bingwork
  • bingwork
  • 2016年05月05日 17:22
  • 3419

基础学习笔记之opencv(18):kmeans函数使用实例

前言   一提到聚类算法,必然首先会想到的是kmeans聚类,因为它的名气实在太大了。既然这样,OpenCV中这个函数也自然必不可少了。这节内容主要是讲讲OpenCV中kmeans函数的使用方法...
  • u011929691
  • u011929691
  • 2013年09月03日 14:43
  • 705

java一维和二维数组实现乘法表

  • 2013年03月10日 20:17
  • 3KB
  • 下载

poj 2813 画家问题(枚举解决一维和二维)

给定一种状态集合,通常一个位置仅有一种状态,对其某一位置进行操作可改变其本身及其相邻位置的状态,通过一系列的操作达到目标状态集,并求出其所有可行操作中最少操作数的过程,可以将其归为画家问题。解决画家问...
  • qq_33584589
  • qq_33584589
  • 2016年06月28日 15:17
  • 305
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:OpenCV: Kmeans的使用一维和二维点集
举报原因:
原因补充:

(最多只允许输入30个字)