C++ 点云聚类中心点提取代码示例
以下是一段基于欧几里得距离的点云聚类中心点提取代码:
// 定义点云数据结构
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坐标)。算法思路为遍历所有点,以每个点为中心,找出在聚类半径范围内的所有点,并计算出聚类中心点的坐标。最后返回所有聚类中心点的坐标。
原文地址: https://www.cveoy.top/t/topic/nHMP 著作权归作者所有。请勿转载和采集!