命名空间“pcl”没有成员“euclideanDistance”怎么解决
时间: 2023-11-17 12:05:44 浏览: 54
抱歉,我的回答有误。pcl库确实没有euclideanDistance函数。
如果要计算欧几里得距离,可以手动计算。以下是计算两个点之间的欧几里得距离的代码示例:
```c++
#include <cmath>
double euclideanDistance(pcl::PointXYZ p1, pcl::PointXYZ p2) {
double dx = p1.x - p2.x;
double dy = p1.y - p2.y;
double dz = p1.z - p2.z;
return std::sqrt(dx * dx + dy * dy + dz * dz);
}
```
在kMeans函数中,将原来的pcl::euclideanDistance(cloud->points[i], centers[j])替换为euclideanDistance(cloud->points[i], centers[j])即可。
```c++
double euclideanDistance(pcl::PointXYZ p1, pcl::PointXYZ p2) {
double dx = p1.x - p2.x;
double dy = p1.y - p2.y;
double dz = p1.z - p2.z;
return std::sqrt(dx * dx + dy * dy + dz * dz);
}
void kMeans(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud, int k) {
pcl::PointXYZ minPt, maxPt;
pcl::getMinMax3D(*cloud, minPt, maxPt);
std::vector<pcl::PointXYZ> centers(k);
for (int i = 0; i < k; i++) {
centers[i].x = minPt.x + (maxPt.x - minPt.x) * rand() / RAND_MAX;
centers[i].y = minPt.y + (maxPt.y - minPt.y) * rand() / RAND_MAX;
centers[i].z = minPt.z + (maxPt.z - minPt.z) * rand() / RAND_MAX;
}
std::vector<int> labels(cloud->points.size());
while (true) {
std::vector<int> counts(k);
for (int i = 0; i < cloud->points.size(); i++) {
double minDist = DBL_MAX;
int minIdx = -1;
for (int j = 0; j < k; j++) {
double dist = euclideanDistance(cloud->points[i], centers[j]);
if (dist < minDist) {
minDist = dist;
minIdx = j;
}
}
labels[i] = minIdx;
counts[minIdx]++;
}
std::vector<pcl::PointXYZ> newCenters(k);
for (int i = 0; i < cloud->points.size(); i++) {
newCenters[labels[i]].x += cloud->points[i].x;
newCenters[labels[i]].y += cloud->points[i].y;
newCenters[labels[i]].z += cloud->points[i].z;
}
bool converged = true;
for (int i = 0; i < k; i++) {
if (counts[i] == 0) {
continue;
}
newCenters[i].x /= counts[i];
newCenters[i].y /= counts[i];
newCenters[i].z /= counts[i];
if (newCenters[i].x != centers[i].x || newCenters[i].y != centers[i].y || newCenters[i].z != centers[i].z) {
converged = false;
}
centers[i] = newCenters[i];
}
if (converged) {
break;
}
}
pcl::PointCloud<pcl::PointXYZRGB>::Ptr coloredCloud(new pcl::PointCloud<pcl::PointXYZRGB>);
coloredCloud->width = cloud->points.size();
coloredCloud->height = 1;
coloredCloud->is_dense = true;
coloredCloud->points.resize(coloredCloud->width * coloredCloud->height);
for (int i = 0; i < cloud->points.size(); i++) {
pcl::PointXYZRGB p;
p.x = cloud->points[i].x;
p.y = cloud->points[i].y;
p.z = cloud->points[i].z;
if (labels[i] == 0) {
p.r = 255;
p.g = 0;
p.b = 0;
} else {
p.r = 0;
p.g = 255;
p.b = 0;
}
coloredCloud->points[i] = p;
}
pcl::PLYWriter writer;
writer.write("D:\\DIANYUNWENJIANJIA\\test4_ply.ply", *coloredCloud);
pcl::visualization::PCLVisualizer viewer("2-MEANS Clustering");
viewer.setBackgroundColor(0.0, 0.0, 0.0);
viewer.addPointCloud(coloredCloud, "coloredCloud");
viewer.spin();
}
```
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)