以下是一段基于欧几里得距离的点云聚类中心点提取代码:

// 定义点云数据结构
struct Point {
  float x, y, z;
};

// 计算欧几里得距离
float euclideanDistance(Point p1, Point p2) {
  float dx = p1.x - p2.x;
  float dy = p1.y - p2.y;
  float dz = p1.z - p2.z;
  return sqrt(dx*dx + dy*dy + dz*dz);
}

// 提取点云聚类中心点
vector<Point> extractClusterCenters(vector<Point> points, float clusterRadius) {
  vector<Point> centers;
  for (int i = 0; i < points.size(); i++) {
    Point center = points[i];
    int numPointsInCluster = 1;
    for (int j = i+1; j < points.size(); j++) {
      Point point = points[j];
      float distance = euclideanDistance(center, point);
      if (distance <= clusterRadius) {
        center.x = (center.x * numPointsInCluster + point.x) / (numPointsInCluster + 1);
        center.y = (center.y * numPointsInCluster + point.y) / (numPointsInCluster + 1);
        center.z = (center.z * numPointsInCluster + point.z) / (numPointsInCluster + 1);
        numPointsInCluster++;
        points.erase(points.begin() + j);
        j--;
      }
    }
    centers.push_back(center);
  }
  return centers;
}

其中,euclideanDistance函数计算两个点之间的欧几里得距离,extractClusterCenters函数提取点云聚类中心点,输入参数为一个点云数据结构(包含所有点的x、y、z坐标)、一个聚类半径,输出结果为一个点云数据结构(包含所有聚类中心点的x、y、z坐标)。算法思路为遍历所有点,以每个点为中心,找出在聚类半径范围内的所有点,并计算出聚类中心点的坐标。最后返回所有聚类中心点的坐标。

C++ 点云聚类中心点提取代码示例

原文地址: https://www.cveoy.top/t/topic/nHMP 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录