opencv2 Kmean分类

 

void Ml_Kmeans2()//39.k_means K均值聚类2
{
	Mat src = imread("img_00.tif");
	imshow("input", src);
	int width = src.cols;
	int height = src.rows;
	int dims = src.channels();

	// 初始化定义
	int sampleCount = width * height;
	int clusterCount = 4;
	Mat points(sampleCount, dims, CV_32F, Scalar(10));
	Mat labels;
	Mat centers(clusterCount, 1, points.type());

	// 图像RGB到数据集转换
	int index = 0;
	for (int row = 0; row < height; row++) {
		for (int col = 0; col < width; col++) {
			index = row * width + col;
			Vec3b rgb = src.at<Vec3b>(row, col);
			points.at<float>(index, 0) = static_cast<int>(rgb[0]);
			points.at<float>(index, 1) = static_cast<int>(rgb[1]);
			points.at<float>(index, 2) = static_cast<int>(rgb[2]);
		}
	}

	// 运行K-Means数据分类
	TermCriteria criteria = TermCriteria(CV_TERMCRIT_EPS + CV_TERMCRIT_ITER, 10, 1.0);
	kmeans(points, clusterCount, labels, criteria, 3, KMEANS_PP_CENTERS, centers);

	// 显示图像分割结果
	Mat result = Mat::zeros(src.size(), CV_8UC3);
	for (int row = 0; row < height; row++)
	{
		for (int col = 0; col < width; col++)
		{
			index = row * width + col;
			int label = labels.at<int>(index, 0);
			if (label == 1)
			{
				result.at<Vec3b>(row, col)[0] = 255;
				result.at<Vec3b>(row, col)[1] = 0;
				result.at<Vec3b>(row, col)[2] = 0;
			}
			else if (label == 2)
			{
				result.at<Vec3b>(row, col)[0] = 0;
				result.at<Vec3b>(row, col)[1] = 255;
				result.at<Vec3b>(row, col)[2] = 0;
			}
			else if (label == 3)
			{
				result.at<Vec3b>(row, col)[0] = 0;
				result.at<Vec3b>(row, col)[1] = 0;
				result.at<Vec3b>(row, col)[2] = 255;
			}
			else if (label == 0)
			{
				result.at<Vec3b>(row, col)[0] = 0;
				result.at<Vec3b>(row, col)[1] = 255;
				result.at<Vec3b>(row, col)[2] = 255;
			}
		}
	}
	imshow("kmeans-demo", result);
	waitKey(0);
}

参考一下文档;

【opencv学习之四十三】K均值聚类算法_abcvincent的博客-CSDN博客_opencv 均值聚类K均值聚类算法,在opencv中通过kmeans()函数实现;k均值通俗讲:就是从一堆样本中,随便挑出几个,比如3个吧,然后用样本中的和这挑出来的比较,比较后排序,谁和挑出的那个接近就把他划到那个类里,比如样A和挑1、挑2、挑3中,挑2最接近,则把样A划到挑2里,当然还没完事,还得再对挑完的3个类群,确定一个类群代表——“均值”,然后以这3个新的代表——“均值”再次与样本对比,直到“均值”不在变了...https://blog.csdn.net/abcvincent/article/details/79943889?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-1.highlightwordscore&spm=1001.2101.3001.4242.2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenCV是一个开源的计算机视觉库,它提了许多用于图像和视频处理的功能。其中之一就是级联分类器(Cascade Classifier),它是一种基于机器学习的目标检测算法。 级联分类器是通过训练得到的,可以用于检测特定对象或特征。在OpenCV中,最常见的应用就是人脸检测。级联分类器通过使用Haar特征和AdaBoost算法来训练,可以在图像中快速准确地检测出人脸。 在Python中使用OpenCV的级联分类器,首先需要加载已经训练好的分类器模型。OpenCV提供了一些预训练好的模型,可以直接使用。然后,将待检测的图像传入分类器中进行检测,如果检测到目标对象,则返回目标的位置信息。 下面是使用OpenCV Python级联分类器的基本步骤: 1. 导入OpenCV库:`import cv2` 2. 加载分类器模型:`face_cascade = cv2.CascadeClassifier('path/to/haarcascade_frontalface_default.xml')` 3. 读取待检测的图像:`img = cv2.imread('path/to/image.jpg')` 4. 将图像转换为灰度图像:`gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)` 5. 使用级联分类器进行检测:`faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))` 6. 遍历检测到的目标,绘制矩形框标记:`for (x, y, w, h) in faces: cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2)` 7. 显示检测结果:`cv2.imshow('Detected Faces', img)` 8. 等待按键退出:`cv2.waitKey(0)` 以上是一个简单的人脸检测示例,你可以根据需要调整参数和模型路径。除了人脸检测,级联分类器还可以用于其他目标的检测,如眼睛、车辆等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值