You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在二值图像上使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 11:54:07