点云法向量显示
向属性表添加
opengl32.lib
源程序
在这里插入代码片
#include<iostream>
#include<pcl/io/io.h>
#include<pcl/io/pcd_io.h>
#include<pcl/io/ply_io.h>
#include<pcl/features/normal_3d.h>
#include<pcl/visualization/cloud_viewer.h>
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL);
int main()
{
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGB>);
pcl::io::loadPCDFile<pcl::PointXYZRGB>("Cylinder1.pcd", *cloud);//加载点云数据
// 创建法向量估计对象并设置输入点云
pcl::NormalEstimation<pcl::PointXYZRGB, pcl::Normal> ne;
ne.setInputCloud(cloud);
// 创建KdTree对象用于近邻搜索
pcl::search::KdTree<pcl::PointXYZRGB>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZRGB>());
ne.setSearchMethod(tree);
// 输出点云法向量
pcl::PointCloud<pcl::Normal>::Ptr cloud_normals(new pcl::PointCloud<pcl::Normal>);
// 设置搜索半径
ne.setRadiusSearch(3);
ne.setViewPoint(0, 0, 1);
ne.compute(*cloud_normals);
// 创建一个PCL可视化对象
pcl::visualization::PCLVisualizer viewer("3D Viewer");
viewer.setBackgroundColor(0, 0, 0); // 设置背景色为黑色
// 添加法向量到视图
viewer.addPointCloudNormals<pcl::PointXYZRGB, pcl::Normal>(cloud, cloud_normals);
//设置点云为单一颜色
pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZRGB> single_color(cloud, 0, 255, 0);
// 添加点云到视图
viewer.addPointCloud<pcl::PointXYZRGB>(cloud,single_color, "sample cloud");
//设置要显示的点云大小
viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "sample cloud");
//添加需要显示的点云法向。cloud为原始点云模型,normal为法向信息,10表示需要显示法向的点云间隔,即每10个点显示一次法向,0.05表示法向长度。
viewer.addPointCloudNormals<pcl::PointXYZRGB, pcl::Normal>(cloud, cloud_normals, 3, 5, "normals");
// 设置视图的姿态
//viewer.setCameraPosition(0, 0, 0, 0, 1, 0, 0, -1, 0);
// 设置视图大小
//viewer.setSize(800, 600);
// 开始可视化循环
while (!viewer.wasStopped())
{
viewer.spinOnce(100);
}
return 0;
}
文章参考
PCL 计算点云的法向量并定向 - 飞我执笔的文章 - 知乎
https://zhuanlan.zhihu.com/p/461263247