首页 > 学院 > 开发设计 > 正文

opencv KMeans.cpp 学习

2019-11-08 02:29:34
字体:
来源:转载
供稿:网友
打算利用KMeans算法做一个聚类,将聚类后的数据进行分析。学习下KMeans API的使用,顺便学习下常见的一些函数的用法。官方文档如下:
#include "opencv2/highgui.hpp"#include "opencv2/core.hpp"#include "opencv2/imgPRoc.hpp"#include <iostream>using namespace cv;using namespace std;// static void help()// {//     cout << "/nThis program demonstrates kmeans clustering./n"//             "It generates an image with random points, then assigns a random number of cluster/n"//             "centers and uses kmeans to move those cluster centers to their representitive location/n"//             "Call/n"//             "./kmeans/n" << endl;// }int main(int /*argc*/, char** /*argv*/){	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);	for (;;)	{		int k, clusterCount = rng.uniform(2, MAX_CLUSTERS + 1);		int i, sampleCount = rng.uniform(1, 1001);		Mat points(sampleCount, 1, CV_32FC2), labels;		clusterCount = MIN(clusterCount, sampleCount);		Mat centers;		/* generate random sample from multigaussian distribution */		for (k = 0; k < clusterCount; k++)		{			Point center;			center.x = rng.uniform(0, img.cols);			center.y = rng.uniform(0, img.rows);			Mat pointChunk = points.rowRange(k*sampleCount / clusterCount,				k == clusterCount - 1 ? sampleCount :				(k + 1)*sampleCount / clusterCount);			rng.fill(pointChunk, RNG::NORMAL, Scalar(center.x, center.y), Scalar(img.cols*0.05, img.rows*0.05));		}		randShuffle(points, 1, &rng);		kmeans(points, clusterCount, labels,			TermCriteria(TermCriteria::EPS + TermCriteria::COUNT, 10, 1.0),			3, KMEANS_PP_CENTERS, centers);		img = Scalar::all(0);		for (i = 0; i < sampleCount; i++)		{			int clusterIdx = labels.at<int>(i);			Point ipt = points.at<Point2f>(i);			circle(img, ipt, 2, colorTab[clusterIdx], FILLED, LINE_AA);		}		imshow("clusters", img);		char key = (char)waitKey();		if (key == 27 || key == 'q' || key == 'Q') // 'ESC'			break;	}	return 0;}RNG 随机数产生器。RNG::uniform() 产生单个服从均匀分布的随机数。RNG::fill(
 (InputOutputArray mat,
  int distType,
  InputArray a,
  InputArray b,
  bool saturateRange = false 
 )
)将Mat填充以服从正态分布或者均匀分布的随机数(正态分布的均值为a,方差为b;均匀分布的边界为a b)后续补充
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表