opencv KMeans.cpp 学习
2017-02-19 13:46
218 查看
打算利用KMeans算法做一个聚类,将聚类后的数据进行分析。学习下KMeans API的使用,顺便学习下常见的一些函数的用法。
官方文档如下:
RNG 随机数产生器。
RNG::uniform() 产生单个服从均匀分布的随机数。
RNG::fill(
)将Mat填充以服从正态分布或者均匀分布的随机数(正态分布的均值为a,方差为b;均匀分布的边界为a b)
后续补充
官方文档如下:
#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 | ||
) |
后续补充
相关文章推荐
- OpenCV/source/sample/cpp的学习
- 从OpenCV源码学习cpp_explicit
- opencv深入学习(七)——square.cpp
- 从OpenCV源码学习cpp_const
- opencv2.4.9中ann_mlp.cpp学习
- Opencv Python版学习笔记(七)k均值-k-means
- 从OpenCV源码学习cpp_virtual
- 侯杰深入浅出MFC中CPP学习
- 正则表达式学习(cpp 代码 )
- OpenCV中滤波器学习笔记(一)--CvSepFilter
- OpenCV学习——基本数据结构
- OpenCV学习——图像通道的GRB分割混合
- 继续探索OpenCV[学习ing]
- OpenCV学习——图像信息读取和倒置
- sizeof ( )——在学习openCV中 create matrix 时发现的问题
- OpenCV学习——梯度化一张图片
- OpenCV学习——边缘检测
- OpenCV学习笔记(一)
- opencv学习01
- OpenCV学习之图像处理[1]