opencv::KMeans方法概述
KMeans方法概述
. 无监督学习方法
. 分类问题,输入分类数目,初始化中心位置
. 硬分类方法,以距离度量
. 迭代分类为聚类

//----------
//迭代算法的终止准则
//----------
TermCriteria(
int type,
//type=TermCriteria::MAX_ITER/TermCriteria::COUNT 迭代到最大迭代次数终止
//type= TermCriteria::EPS 迭代到阈值终止
//type= TermCriteria::MAX_ITER+ TermCriteria::EPS 上述两者都作为迭代终止条件
int maxCount, //迭代的最大次数
double epsilon // 阈值(中心位移值)
);
//----------
//按照给定的类别数目对样本集合进行聚类
//----------
void cvKMeans2(
const CvArr* samples, //输入样本的浮点矩阵,每个样本一行。
int cluster_count, //所给定的聚类数目
CvArr* labels, //输出整数向量:每个样本对应的类别标识
CvTermCriteria termcrit //指定聚类的最大迭代次数和/或精度(两次迭代引起的聚类中心的移动距离)
)

#include <opencv2/opencv.hpp>
#include <iostream> using namespace cv;
using namespace std; int main(int argc, char** argv) {
Mat img(, , CV_8UC3);
RNG rng(); //scalar是将图像设置成单一灰度和颜色
Scalar colorTab[] = {
Scalar(, , ),
Scalar(, , ),
Scalar(, , ),
Scalar(, , ),
Scalar(, , )
}; //分类个数
int numCluster = rng.uniform(, );
printf("number of clusters : %d\n", numCluster); //取10-100个随机样本
int sampleCount = rng.uniform(, );
//每一列至少两个数
Mat points(sampleCount, , CV_32FC2);
Mat labels;
Mat centers; // 生成随机数
for (int k = ; k < numCluster; k++) {
Point center;
center.x = rng.uniform(, img.cols);
center.y = rng.uniform(, img.rows);
//行,给随机点
Mat pointChunk = points.rowRange(k*sampleCount/numCluster, k == numCluster - ? sampleCount : (k + )*sampleCount / numCluster); //用随机数填充矩阵
rng.fill(pointChunk, RNG::NORMAL, Scalar(center.x, center.y), Scalar(img.cols*0.05, img.rows*0.05));
}
//算法打乱元素排列顺序
randShuffle(points, , &rng); // 使用KMeans
kmeans(points, numCluster, labels, TermCriteria(TermCriteria::EPS + TermCriteria::COUNT, , 0.1/*最小值*/), /*次数*/, KMEANS_PP_CENTERS, centers); // 用不同颜色显示分类
//初始化图片颜色。
img = Scalar::all();
for (int i = ; i < sampleCount; i++) {
int index = labels.at<int>(i);
//获取ponint点
Point p = points.at<Point2f>(i);
//填充
circle(img, p, , colorTab[index], -, );
} // 每个聚类的中心来绘制圆
for (int i = ; i < centers.rows; i++) {
int x = centers.at<float>(i, );
int y = centers.at<float>(i, );
printf("c.x= %d, c.y=%d", x, y);
circle(img, Point(x, y), , colorTab[i], , LINE_AA);
} imshow("KMeans-Data-Demo", img);
waitKey();
return ;
}
opencv::KMeans方法概述的更多相关文章
- Lua 调用 Opencv 的方法
Lua 调用 Opencv 的方法 最近想用 Lua 调用 Opencv 进行相关像素级操作,如:bitwise_and 或者 bitwise_or,从而完成图像 IoU 的计算. 那么,怎么用 Lu ...
- paip.函数式编程方法概述以及总结
paip.函数式编程方法概述以及总结 1 函数式编程:函数式风格..很多命令式语言里支持函数式编程风格 1.1 起源 (图灵机,Lisp机器, 神经网络计算机) 1.2 函 ...
- DBA_Oracle性能优化的基本方法概述(方法论)
2014-12-18 Created By BaoXinjian
- OpenCV视频播放方法
OpenCV视频播放方法 今天折腾了一下OpenCV的视频播放功能,希望能对项目又帮助- 代码还是非常easy的,仅仅是之前遇到点小麻烦,找不到cvCreateFileCapture函数的定义,花了一 ...
- javacpp-opencv图像处理3:使用opencv原生方法遍历摄像头设备及调用(增加实时帧率计算方法)
javaCV图像处理系列: javaCV图像处理之1:实时视频添加文字水印并截取视频图像保存成图片,实现文字水印的字体.位置.大小.粗度.翻转.平滑等操作 javaCV图像处理之2:实时视频添加图片水 ...
- 循环语句(for,while,do……while),方法概述
循环结构 分类:for,while,do……while (1)for语句 格式: for(初始化表达式:条件表达式:循环后的操作表达式){ 循环体: } 执行流程: a.执行初始化语句 b.执行判断条 ...
- 使用Spring Security3的四种方法概述
使用Spring Security3的四种方法概述 那么在Spring Security3的使用中,有4种方法: 一种是全部利用配置文件,将用户.权限.资源(url)硬编码在xml文件中,已经实现过, ...
- Python 使用k-means方法将列表中相似的句子聚为一类
由于今年暑假在学习一些自然语言处理的东西,发现网上对k-means的讲解不是很清楚,网上大多数代码只是将聚类结果以图片的形式呈现,而不是将聚类的结果表示出来,一下代码将老师给的代码和网上的代码结合了一 ...
- opencv kmeans 图像分割
利用kmeans算法,将彩色图像的像素点作为样本,rgb值作为样本的属性, 对图像所有的像素点进行分类,从而实现对图像中目标的分割. c++代码(openCV 2.4.11) Scalar color ...
随机推荐
- NSURLSession的知识小记
1.NSURLSession的使用流程 使用NSRULSession对象创建Task, 然后执行Task 2.获取NSURLSession ()获得共享的Session + (NSURLSession ...
- SqlServer中用@@IDENTITY取最新ID不准的问题
最近遇到了一个SqlServer中用@@IDENTITY取最新ID不准的问题,经过在网上的一番查找,找到了如下资料,略作记录:"一个网友问我一个关于@@IDENTITY的问题.他的数据库中有 ...
- MySQL 部署分布式架构 MyCAT (三)
配置垂直分表 修改 schema.xml (db1) cd /data/mycat/conf cp schema.xml schema.xml.rwh # 修改配置 vi schema.xml < ...
- Redis—负载状态
服务端启动与客户端连接 # 服务端启动# 客户端连接:host:远程redis服务器IP.port:远程redis服务端口.password:远程redis服务密码(无密码就不需要-a参数了) [ro ...
- Apache—给一个站点绑定多个域名
前提简介: ServerAdmin:Apache服务管理员通知邮箱地址,如果有真实的邮箱地址也可以设置此值. ServerName:是服务的名字,只能填写一个域名. ServerAlias:serv ...
- Sqlserver 2014 下载
ed2k://|file|cn_sql_server_2014_enterprise_edition_x64_dvd_3932882.iso|2898847744|A33CE10CD989083D1A ...
- Pwnable-bof
Download : http://pwnable.kr/bin/bof Download : http://pwnable.kr/bin/bof.c 下载之后,先看看c源码 #include < ...
- 更换github账号后,push被旧账号阻止
和网上多数的教程不同,我是需要直接更换账号.切换后push一直被阻止.解决后记录下办法 remote: Permission to new-name/practice.git denied to ol ...
- 剑指Offer-21.栈的压入、弹出序列(C++/Java)
题目: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈 ...
- <Binary Search> 81 (高频)34 (很难hard, 高频)315 (hard)354
81. Search in Rotated Sorted Array II 如果中间的数小于最右边的数,则右半段是有序的,若中间数大于最右边数,则左半段是有序的.而如果可以有重复值,就会出现来面两种情 ...