#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/common/common.h>
#include <pcl/kdtree/kdtree_flann.h>
#include <pcl/features/normal_3d_omp.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <boost/thread/thread.hpp>
using namespace std;
int main()
{
//------------------------------读取点云---------------------------
pcl::PointCloud<pcl::PointXYZI>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZI>);
if (pcl::io::loadPCDFile<pcl::PointXYZI>("E://data//CSite1_orig-utm.pcd", *cloud) == -1)
{
PCL_ERROR("Could not read file\n");
}
//------------------------------计算法线----------------------------
pcl::NormalEstimationOMP<pcl::PointXYZI, pcl::Normal> n;//OMP加速
pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal>);
pcl::search::KdTree<pcl::PointXYZI>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZI>());
n.setNumberOfThreads(10);
n.setViewPoint(0, 0, 0); // 设置视点,默认为(0,0,0)
n.setInputCloud(cloud);
n.setSearchMethod(tree);
n.setKSearch(10); // 点云法向计算时,需要所搜的近邻点大小
//n.setRadiusSearch(0.03); // 半径搜素
n.compute(*normals); // 开始进行法向计
// ------------------------计算给定点位的坡度-------------------------
Eigen::Vector3f orZDir(0, 0, 1); // Z轴正方向
std::vector<double>pointSlope(normals->points.size(), 0); // 给定点位的坡度
for (int i = 0; i < normals->points.size(); ++i)
{
auto normal = normals->points[i].getNormalVector3fMap();
// 法向量定向,使其全部朝向Z轴正方向
if (normal.norm() == 0.0)
{
normal = orZDir;
}
else if (normal.dot(orZDir) < 0.0)
{
normal *= -1.0;
}
pointSlope[i] = pcl::getAngle3D(normal, orZDir, false);
// 这一步是为了将坡度计算结果可视化出来,所以将坡度存储到强度字段
cloud->points[i].intensity = pointSlope[i];
}
//-----------------------强度(坡度)渲染并可视化-----------------------
boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));
pcl::visualization::PointCloudColorHandlerGenericField<pcl::PointXYZI>fildColor(cloud, "intensity");
viewer->setBackgroundColor(0, 0, 0);
viewer->setWindowName("点云按坡度显示");
viewer->addText("Point clouds are shown by intensity", 50, 50, 0, 1, 0, "v1_text");
viewer->addPointCloud<pcl::PointXYZI>(cloud, fildColor, "sample cloud");
viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "sample cloud");
while (!viewer->wasStopped())
{
viewer->spinOnce(100);
boost::this_thread::sleep(boost::posix_time::microseconds(100000));
}
return 0;
}
没有合适的资源?快使用搜索试试~ 我知道了~
使用PCL计算点云中每个点的坡度
共1个文件
cpp:1个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 81 浏览量
2023-11-25
10:34:01
上传
评论 1
收藏 1KB RAR 举报
温馨提示
使用PCL计算点云中每个点的坡度
资源推荐
资源详情
资源评论
收起资源包目录
计算点云点的坡度.rar (1个子文件)
新建文件夹
slopeNoraml.cpp 3KB
共 1 条
- 1
资源评论
点云侠
- 粉丝: 4w+
- 资源: 72
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功