如何在二值图像上使用OpenCV kmeans函数获取两个blob的中心
OpenCV二值图像kmeans聚类求Blob中心问题解决
报错根因
findNonZero输出的矩阵为N行1列的双通道格式,每个元素直接存储(x,y)坐标对,不符合kmeans要求的「N行2列单通道32F矩阵,每行对应一个样本、每列对应一个特征」的输入规则- 你当前代码中kmeans第二个参数(聚类簇数K)若未设置为2,也不符合你求两个Blob中心的需求
修正后可运行代码
vector<Point2f> centers; Mat points; findNonZero(binary_image, points); // 关键格式转换:转为单通道,行数保留总点数,自动生成N行2列符合要求的结构 points = points.reshape(1, points.total()); points.convertTo(points, CV_32F); // 提前判断避免非零点不足导致的异常 if (points.total() >= 2) { // 第二个参数K填2,对应两个Blob的聚类需求 kmeans(points, 2, Mat(), TermCriteria(TermCriteria::EPS + TermCriteria::COUNT, 10, 1.0), 3, KMEANS_PP_CENTERS, centers); }
结果说明
最终输出的centers向量长度为2,两个元素分别对应两个Blob的聚类中心坐标,可直接用于后续业务逻辑。
内容的提问来源于stack exchange,提问作者SY B
相关产品推荐
相关产品推荐

