使用pcl库编写prim最小生成树检测点云ply文件内点的最短路径并将其可视化且创建一个条件判断如果最小生成树跑出来的路径上点的个数小于3就将该条路径删除的c++代码
以下是使用pcl库编写的prim最小生成树检测点云ply文件内点的最短路径并将其可视化的C++代码。同时,添加了一个条件判断,如果最小生成树中的路径上的点的个数小于3,则将该路径删除。
#include <iostream>
#include <pcl/point_types.h>
#include <pcl/io/ply_io.h>
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/features/normal_3d.h>
#include <pcl/kdtree/kdtree_flann.h>
#include <pcl/surface/gp3.h>
#include <pcl/search/search.h>
#include <pcl/search/kdtree.h>
typedef pcl::PointXYZ PointT;
typedef pcl::PointCloud<PointT> PointCloudT;
int main(int argc, char** argv)
{
// 加载点云数据
PointCloudT::Ptr cloud(new PointCloudT);
pcl::io::loadPLYFile<PointT>("input_cloud.ply", *cloud);
// 计算法线
pcl::NormalEstimation<PointT, pcl::Normal> ne;
ne.setInputCloud(cloud);
pcl::search::KdTree<PointT>::Ptr tree(new pcl::search::KdTree<PointT>());
ne.setSearchMethod(tree);
pcl::PointCloud<pcl::Normal>::Ptr cloud_normals(new pcl::PointCloud<pcl::Normal>);
ne.setKSearch(20);
ne.compute(*cloud_normals);
// 构建搜索树
pcl::search::KdTree<PointT>::Ptr kdtree(new pcl::search::KdTree<PointT>);
kdtree->setInputCloud(cloud);
// 使用Prim算法计算最小生成树
std::vector<int> visited(cloud->points.size(), 0);
std::vector<int> parent(cloud->points.size(), -1);
visited[0] = 1;
int num_visited = 1;
while (num_visited < cloud->points.size()) {
int min_dist_idx = -1;
int min_dist_parent = -1;
float min_dist = std::numeric_limits<float>::max();
for (int i = 0; i < cloud->points.size(); i++) {
if (visited[i]) {
pcl::PointXYZ searchPoint = cloud->points[i];
std::vector<int> pointIdxNKNSearch(1);
std::vector<float> pointNKNSquaredDistance(1);
if (kdtree->nearestKSearch(searchPoint, 1, pointIdxNKNSearch, pointNKNSquaredDistance) > 0) {
int nearest_idx = pointIdxNKNSearch[0];
if (!visited[nearest_idx] && pointNKNSquaredDistance[0] < min_dist) {
min_dist_idx = nearest_idx;
min_dist_parent = i;
min_dist = pointNKNSquaredDistance[0];
}
}
}
}
if (min_dist_idx >= 0) {
visited[min_dist_idx] = 1;
parent[min_dist_idx] = min_dist_parent;
num_visited++;
}
}
// 删除路径上点个数小于3的边
for (int i = 1; i < cloud->points.size(); i++) {
if (parent[i] >= 0) {
int count = 1;
int idx = i;
while (parent[idx] >= 0) {
count++;
idx = parent[idx];
}
if (count < 3) {
parent[i] = -1;
}
}
}
// 可视化最短路径
pcl::visualization::PCLVisualizer viewer("Cloud Viewer");
viewer.setBackgroundColor(0.0, 0.0, 0.5);
viewer.addPointCloud(cloud, "cloud");
for (int i = 1; i < cloud->points.size(); i++) {
if (parent[i] >= 0) {
pcl::PointXYZ p1 = cloud->points[parent[i]];
pcl::PointXYZ p2 = cloud->points[i];
std::stringstream ss;
ss << "edge_" << i;
viewer.addLine(p1, p2, 1.0, 0.0, 0.0, ss.str());
}
}
viewer.spin();
return 0;
}
在上述代码中,首先加载点云数据,然后计算法线。接下来,使用Prim算法计算最小生成树,并使用条件判断删除路径上点的个数小于3的边。最后,使用可视化工具将最短路径可视化出来。请注意替换input_cloud.ply为您自己的点云PLY文件路径
原文地址: https://www.cveoy.top/t/topic/hDhV 著作权归作者所有。请勿转载和采集!