opencv kmeans (C++)

2023-05-16

kmeans

函数原型

double cv::kmeans(
	InputArray 	data,
	int 	K,
	InputOutputArray 	bestLabels,
	TermCriteria 	criteria,
	int 	attempts,
	int 	flags,
	OutputArray 	centers = noArray()
)

参数说明

  • Parameters

    data待聚类的数据集,数据集的每一个样本是一个N维的点,点坐标都是float型的,例如:有m个样本,每个样本有n个维度,那data的格式就为cv::Mat dataSet(m,n,CV_32F)
    K聚类数,即要把数据集聚成k类.
    bestLabels存储data中每一个样本的标签,数据类型为int型
    criteriaopencv中迭代算法的终止条件,例如迭代的次数限制,或者迭代的精度达到要求时,算法迭代终止
    attempts使用不同的初始聚类中心执行算法的次数
    flagscv::KmeansFlags见下表,选择聚类中心的初始化方式
    centersOutput matrix of the cluster centers, one row per each cluster center.
  • cv::KmeansFlags

KMEANS_RANDOM_CENTERS Python: cv.KMEANS_RANDOM_CENTERSSelect random initial centers in each attempt.
KMEANS_PP_CENTERS Python: cv.KMEANS_PP_CENTERSUse kmeans++ center initialization by Arthur and Vassilvitskii [Arthur2007].
KMEANS_USE_INITIAL_LABELS Python: cv.KMEANS_USE_INITIAL_LABELSDuring the first (and possibly the only) attempt, use the user-supplied labels instead of computing them from the initial centers. For the second and further attempts, use the random or semi-random centers. Use one of KMEANS_*_CENTERS flag to specify the exact method.

示例

读取一张图片,把图片中每一个像素点的RGB值作为特征进行聚类(颜色量化),聚类数目根据需要进行调整。

#include "opencv.hpp"


int kmeansDemo(cv::Mat &srcImage, cv::Mat &dst, int clusterCount)
{
	if (srcImage.empty())
		return -1;
	if (clusterCount <= 0)
		return -1;

	//cv::GaussianBlur(srcImage, srcImage, cv::Size(0, 0), 2);
	int width = srcImage.cols;
	int height = srcImage.rows;

	//init
	int sampleCount = width * height;
	cv::Mat labels;//Input/output integer array that stores the cluster indices for every sample
	cv::Mat centers;//Output matrix of the cluster centers, one row per each cluster center.

	// convert image to kmeans data
	cv::Mat sampleData = srcImage.reshape(3, sampleCount);//every pixel is a sample
	cv::Mat data;
	sampleData.convertTo(data, CV_32F);

	//K-Means
	cv::TermCriteria criteria = cv::TermCriteria(cv::TermCriteria::EPS + cv::TermCriteria::COUNT, 5, 0.1);
	cv::kmeans(data, clusterCount, labels, criteria, clusterCount, cv::KMEANS_PP_CENTERS, centers);

	//create a color map
	std::vector<cv::Scalar> colorMaps;
	uchar b, g, r;;
	//clusterCount is equal to centers.rows
	for (int i = 0; i < centers.rows; i++)
	{
		b = (uchar)centers.at<float>(i, 0);
		g = (uchar)centers.at<float>(i, 1);
		r = (uchar)centers.at<float>(i, 2);
		colorMaps.push_back(cv::Scalar(b, g, r));
	}
	// Show  result
	int index = 0;
	dst = cv::Mat::zeros(srcImage.size(), srcImage.type());
	uchar *ptr=NULL;
	int *label = NULL;
	for (int row = 0; row < height; row++) {
		ptr = dst.ptr<uchar>(row);
		for (int col = 0; col < width; col++) {
			index = row * width + col;
			label = labels.ptr<int>(index);
			*(ptr + col * 3) = colorMaps[*label][0];
			*(ptr + col * 3 + 1) = colorMaps[*label][1];
			*(ptr + col * 3 + 2) = colorMaps[*label][2];
		}
	}
		
	return 0;
}

int main()
{
	int clusterCount = 8;//the number of clusters
	std::string path = "K:\\deepImage\\fruit.jpg";
	cv::Mat srcImage = cv::imread(path);
	cv::imshow("srcImage", srcImage);
	cv::Mat dst;
	
	kmeansDemo(srcImage,dst,clusterCount);

	std::string txt = "clusters:" + std::to_string(clusterCount);
	cv::putText(dst, txt, cv::Point(5, 35), 0, 1, cv::Scalar(0, 255, 250), 2);
	cv::imshow("result", dst);
	cv::waitKey(0);
	return 0;
}
  • 效果

聚类数为8时的效果

聚类数为8

聚类数为16

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

opencv kmeans (C++) 的相关文章

  • 使用 OpenCV 绘制固定的网格线集

    是否可以根据 OpenCV 示例文件中颜色检测示例的输出 在所有交叉点处绘制具有定义点的用户定义网格线 基本上 网络摄像头需要从您上方检测人的头部和肩膀 然后 当检测到一个人时 我需要网格线在那里 以便我能够知道在 x 轴和 y 轴 前额和
  • OpenCV 中更新窗口的 waitKey() 的替代方法

    到目前为止我见过的所有示例和书籍都建议使用 waitKey 1 来强制重新绘制 OpenCV 窗口 这看起来很奇怪而且太老套了 不必要的时候为什么还要等待 1 毫秒呢 还有其他选择吗 我尝试了 cv updateWindow 但它似乎需要
  • OpenCV:处理每一帧

    我想使用 OpenCV 编写一个跨平台应用程序进行视频捕获 在所有示例中 我发现来自相机的帧是使用抓取功能进行处理并等待一段时间 我想处理序列中的每一帧 我想定义自己的回调函数 每次当一个新帧准备好处理时都会执行该函数 例如直播对于 Win
  • 使用 openCV 锐化视频图像

    我想使用 OpenCV 锐化我的图像 我在网上查看了一个示例 该示例正在对灰度图像执行锐化 我尝试了它 它工作得很好 然而 我现在尝试做同样的事情 但使用 RGB 颜色 所以我分别在三个通道上执行相同的功能 但它没有给我任何结果 图像与原始
  • 使用 Unity3D 解决 PnP

    我有一个真实 物理的棍子 上面连接有红外摄像头和一些红外 LED 它们形成了我正在使用的模式 以便使虚拟棍子以与物理棍子相同的方式移动 为此 我在 Python 中使用 OpenCV 并将由solvePnP 计算的旋转和平移向量发送到 Un
  • 从视频/图像中提取元数据

    我从 IP 摄像机获取 MJPEG 流 我正在查看该流并将其保存在计算机上 可以找到我的操作代码here https stackoverflow com questions 21702477 how to parse mjpeg http
  • `opencv.android.JavaCameraView` 和 `opencv.android.NativeCameraView` 有什么区别

    正如主题中所述 有什么区别opencv android JavaCameraView and opencv android NativeCameraView 与其他主要优点相比 有哪些优点可以提供更多选择 来自OpenCV 文档 http
  • Opencv - 找不到头文件

    我正在尝试使用 opencv 开始开发 问题是 到目前为止我几乎无法设置 opencv 因为我找不到它的头文件 我对此主题进行了一些研究 但没有一个真正有帮助 下面是一些链接 opencv2 包含文件在哪里 https stackoverf
  • 有人曾经在 MacOS 10.6 上使用过 OpenCV 和 Python 2.7 吗?

    在过去的 6 个月里 我一直断断续续地尝试让 OpenCV 在 MacOS 上与 Python 配合使用 每次有新版本发布时 我都会再次尝试并失败 我已经尝试过 64 位和 32 位 并且 xcode gcc 和 gcc 都是通过 macp
  • OpenCV 完美识别物体

    我有一个应用程序 我想一次跟踪 2 个在图片中相当小的对象 该应用程序应该在 Android 和 iPhone 上运行 因此算法应该是高效的 对于我的客户来说 如果我们提供一些模式以及附加到要跟踪的对象的软件 以获得易于识别的目标 那就完全
  • 在 Android 中使用 OpenCV 查找图像匹配

    我正在尝试构建一个 Android 应用程序 该应用程序可以比较设备相机拍摄的照片 以在一组图像中找到匹配项 我已经在 Android Studio 上配置了 OpenCV 但仅此而已 有人可以通过链接到资源或建议教程来提供帮助吗 Open
  • Haar训练时正样本和负样本使用多少张图片?

    我已经阅读了大量有关 Haar 训练的内容 但我不清楚应该为正样本集和负样本集使用多少图像 我看到建议使用很多图像 有些人推荐数千张 我也不清楚正负样本图像的数量是否应该相同 这是关于 Haar 训练的最佳教程 你试过这个吗 http no
  • 警告:发生了非法反射访问操作(java 中的便携式 opencv)

    我想做一个便携的opencv将依赖项添加到 maven 文件的应用程序pom xml 简化的代码是 import org opencv core Mat public class Builder public static void mai
  • Android API人脸检测与OpenCV/JavaCV人脸检测

    我在 Android 设备上使用了本地 Android 人脸检测 但它似乎很慢 而且我不太确定其可靠性 我还使用了 OpenCV 的人脸检测 但仅限于 PC 而不是 Android 设备 对于 Android 我猜我必须使用 JavaCV
  • Opencv 运动检测与跟踪

    我需要在网络摄像头的视频帧中进行强大的运动检测和跟踪 背景总是一样的 目的是识别物体的位置 如果可能的话没有阴影 但并不急于去除阴影 我已经尝试过用于背景减法和阈值化的opencv算法 但这仅取决于一个图像作为背景 如果背景的亮度 或相机自
  • 在 Python 中使用音频流 RTMP 通过管道和 OpenCV 到 FFmpeg

    我正在尝试使用音频流式传输 FFmpeg 我将在下面展示我的代码 导入模块 import subprocess as sp 创建变量 rtmpUrl rtmp a rtmp youtube com live2 key camera path
  • 使用 pygtk3 将 GUI 窗口添加到 python opencv2 程序

    我已经使用Python和Opencv2完成了一个程序 现在 我想向我的程序添加一个 GUI 窗口 我对 PyGtk3 有一些经验 因此 我修改了代码以采用 PyGtk3 但是 我遇到了错误 因此 我尝试了一个简单的程序来找出实际的错误 我的
  • 使用 openCV 对图像中的子图像进行通用检测

    免责声明 我是计算机视觉菜鸟 我看过很多关于如何在较大图像中查找特定子图像的堆栈溢出帖子 我的用例有点不同 因为我不希望它是具体的 而且我不确定如何做到这一点 如果可能的话 但我感觉应该如此 我有大量图像数据集 有时 其中一些图像是数据集的
  • OpenCV 中的 Gabor 内核参数

    我必须在我的应用程序中使用 Gabor 过滤器 但我不知道这个 OpenCV 方法参数值 我想对虹膜进行编码 启动 Gabor 过滤器并获取特征 我想对 12 组 Gabor 参数值执行此操作 然后我想计算 Hamming Dystans
  • 如何将 Opencv VideoWriter 与 GStreamer 结合使用?

    我正在尝试使用 Opencv VideoWriter 传输 h264 流 以使用 VideoCapture 将其传输到网络上的另一台电脑上 但是 我被困在 VideoWriter 上 执行此代码会返回错误 并且 out isOpened 始

随机推荐

  • mongodb template 计算mongodb日期的解决方案

    mongodb由于特殊的日期格式 存在 8时区的问题 所以在使用java程序解决日期计算问题就会有点麻烦 其实也很简单 就是先将日期改变时区 然后转成带有格式String类型的日期 然后在java里面的将String转化成date类型即可
  • 一篇文章彻底理解二分搜索树(附代码实现)

    本文使用JAVA语言进行描述 其实本质上什么语言描述数据结构都是可以的 二叉树基础 二叉树的根节点 二叉树递归结构 xff1a 上面是一个满二叉树 但是实际中也有二叉树不是满的 二分搜索树 二分搜索树也不一定是满的 所以使用二分搜索树需要具
  • opengl 源码分析常见问题

    Opengl 一些问题解答 为什么opengl 不能跨线程 大家有没有想过这个问题 xff0c 网上给出的答案其实看得不太明白 xff0c 接下来我们看源码让你知道 C EGLContext Display createContext EG
  • mongodbtamplate使用程序创建mongdb索引的解决方案

    话不多说 xff0c 直接上代码 xff1a span class token keyword public span span class token keyword boolean span span class token funct
  • el表达式取不到值

    在jsp页面中有可能出现el表达式取不到值的问题 xff0c 但是反复检查代码 xff0c 跑断点都没有问题 xff0c 这是因为jsp忽略了el表达式 所以只要加上下面一行代码就可以了 span class token operator
  • Kaggle心脏病数据集为例学习机器学习的可解释性分析

    需要安装的工具包 pip install numpy pandas matplotlib seaborn wheel pandas profiling jupyter notebook span class token operator s
  • readlink /var/lib/docker/overlay2: invalid argument的解决方案

    发生这种情况是因为在运行Docker映像之间重新启动了docker xff0c 该映像已损坏 我重新启动系统 xff0c 然后运行以下命令 docker compose build no cache docker compose up 您还
  • python调用IP摄像头

    利用RTSP 43 opencv就可以实现网络摄像头的调用 rtsp是实时流传输协议 xff0c 是基于TCP IP协议体系中的一个应用层协议 xff0c 可以控制声音或者影像的多媒体串流协议 但是不同品牌的摄像头有不同的RTSP地址 下面
  • 22岁-时光如河,浮生为鱼

    时光如河 xff0c 浮生为 x1f41f 还没有学会告别 xff0c 四年就这样悄悄过去了 如往年今日一样 xff0c 依旧写些懒懒散散的文字致敬这一年的时光 x1f495 22岁生日快乐 x1f495 全文约4200字 xff0c 阅读
  • 电子书下载网站汇总

    网站名称地址简介语言推荐指数备注Book4Uhttp www book4you sk 外文下载网站斯洛伐克语 BookYardshttps www bookyards com en welcome主要面向教师的门户网站 xff0c 其中的书
  • Docker版 E5续订的E5调用API续订服务:Microsoft 365 E5 Renew X

    本文是基于作者SundayRX提出的E5 调用API续订服务 xff1a Microsoft 365 E5 Renew X的基础上提出的Docker版本的E5调用API续订服务 基础的账号注册等过程见SundayRX的博客 xff1a 账号
  • Docker版 Linux百度网盘备份工具

    一些必须要知道的事 xff1a 这个镜像的主要目的是为了将服务器或者群晖等linux场景中的资料备份到百度网盘中容器的基础镜像为ubuntu镜像 容器的备份周期为每天的凌晨两点 具体步骤如下 xff1a 下载镜像 docker pull h
  • 操作系统(五)中断和异常

    1 5 中断和异常 在上节内核态与用户态的转换过程中曾经提到过 xff0c 操作系统会响应中断信号强制夺回CPU使用权 xff0c 使用户态转换为内核态 中断 是操作系统夺回CPU使用权的唯一方式 xff0c 如果没有 中断 机制 xff0
  • Mediacodec 如何硬件解码到纹理的

    Mediacodec 如何硬件解码到纹理的 背景 xff1a 网上很多关于mediacodec xff0c surface xff0c surfacetexture的源码分析 xff0c 以及内部原理 xff0c 但是都局限于各自的内容 x
  • pyinstaller 递归深度设置(A RecursionError occurred)

    简介 xff1a pyinstaller常用于打包python文件 xff0c 当导入的包过多时常会出现一个递归深度超过限制的错误 这个可以通过设置最大递归深度来解决 1 pyinstaller报错信息 61 61 61 61 61 61
  • labelme标注格式转coco格式

    摘要 xff1a labelme是广泛使用的深度学习标注工具 xff0c 支持目标检测和实例分割等任务的标注 xff0c 但是一些框架如detectron2 xff0c solo等需要的是coco格式的 xff0c 这里提供一个示例把lab
  • opencv C++ 旋转任意角度图片

    摘要 xff1a opencv里面似乎没有直接的旋转图片的接口 xff0c 这里实现一个旋转任意角度的方法 xff0c 在旋转的时候调用opencv里面的仿射变换函数实现 有两种旋转模式 xff1a 一种按图片中心旋转 xff0c 尺寸与原
  • C++ opencv曲线拟合

    简介 xff1a 此问题是在做旋转模板匹配的时候 xff0c 选择最好的匹配结果时产生的 查找资料发现多项式拟合问题可以变成一个超定方程的求解问题 xff0c 而opencv中本身有一个cv solve 函数可以求解线性方程组 xff0c
  • C# 中的Bitmap 和(c++)opencv之间的传递

    C 中的Bitmap 和 xff08 c 43 43 xff09 opencv之间的传递 文章目录 C 中的Bitmap 和 xff08 c 43 43 xff09 opencv之间的传递1 C 传递bitmap给C 43 43 2 Pix
  • opencv kmeans (C++)

    kmeans 函数原型 span class token keyword double span cv span class token operator span span class token function kmeans span