一些点云的小知识,从官方文档中发现的例子
1、判断点云的点是否是有效的
1 2 3 4 5 6 7 8 9 10 11 12 | pcl::PointXYZ p_valid; p_valid.x = 0; p_valid.y = 0; p_valid.z = 0; std::cout << "Is p_valid valid? " << pcl::isFinite(p_valid) << std::endl; // If any component is NaN, the point is not finite. pcl::PointXYZ p_invalid; p_invalid.x = std::numeric_limits< float >::quiet_NaN(); p_invalid.y = 0; p_invalid.z = 0; std::cout << "Is p_invalid valid? " << pcl::isFinite(p_invalid) << std::endl; |
打印结果:
2、复制同类的点云
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | // 拷贝点云 pcl::PointCloud<pcl::PointXYZ>::Ptr cloud( new pcl::PointCloud<pcl::PointXYZ>()); pcl::PointCloud<pcl::PointXYZ>::PointType p; // 相当于 pcl::PointXYZ p; p.x = 1; p.y = 2; p.z = 3; cloud->push_back(p); std::cout << p.x << " " << p.y << " " << p.z << std::endl; pcl::PointCloud<pcl::PointXYZ>::Ptr cloud2( new pcl::PointCloud<pcl::PointXYZ>()); copyPointCloud(*cloud, *cloud2); // 相同类型复制 pcl::PointCloud<pcl::PointXYZ>::PointType p_retrieved = (*cloud2)[0]; //pcl::PointXYZ p_retrieved = cloud2->points.at(0);// 同上 std::cout << p_retrieved.x << " " << p_retrieved.y << " " << p_retrieved.z << std::endl; |
结果:
3、 类型不同的点云复制
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | // 拷贝点云 pcl::PointCloud<pcl::PointXYZ>::Ptr cloud( new pcl::PointCloud<pcl::PointXYZ>()); pcl::PointCloud<pcl::PointXYZ>::PointType p; // 相当于 pcl::PointXYZ p; p.x = 1; p.y = 2; p.z = 3; cloud->push_back(p); std::cout << p.x << " " << p.y << " " << p.z << std::endl; pcl::PointCloud<pcl::PointNormal>::Ptr cloud2( new pcl::PointCloud<pcl::PointNormal>()); copyPointCloud(*cloud, *cloud2); // 不同类型复制,注意cloud2是包含点和法线的,若类型是pcl::Normal会报错 //pcl::PointCloud<pcl::PointNormal>::PointType p_retrieved = (*cloud2)[0]; pcl::PointNormal p_retrieved = cloud2->points.at(0); // 同上 std::cout << p_retrieved.x << " " << p_retrieved.y << " " << p_retrieved.z << std::endl; std::cout << cloud2->points.at(0).x << " " << cloud2->points.at(0).y << " " << cloud2->points.at(0).z << std::endl; std::cout << cloud2->points.at(0).normal[0] << std::endl; std::cout << cloud2->points.at(0).normal_y << std::endl; std::cout << cloud2->points.at(0).normal[2] << std::endl; |
结果:
4、获取导入点云文件的最大值和最小值点
1 2 3 4 5 6 7 8 | pcl::PointXYZ minPt, maxPt; pcl::getMinMax3D(*n.cloud, minPt, maxPt); std::cout << "Max x: " << maxPt.x << std::endl; std::cout << "Max y: " << maxPt.y << std::endl; std::cout << "Max z: " << maxPt.z << std::endl; std::cout << "Min x: " << minPt.x << std::endl; std::cout << "Min y: " << minPt.y << std::endl; std::cout << "Min z: " << minPt.z << std::endl; |
结果:
另一种写法:
1 2 3 4 5 6 7 8 9 10 11 12 | // 遍历点云区间 for ( const auto & p : n.cloud->points) { if (minX > p.x) minX = p.x; if (minX > p.y) minY = p.y; if (minX > p.z) minZ = p.z; if (maxX < p.x) maxX = p.x; if (maxY < p.y) maxY = p.y; if (maxZ < p.z) maxZ = p.z; } qDebug() << minX << minY << minZ << maxX << maxY << maxZ; |
结果:
导入的是同一个文件,但为什么结果不一样呢,因为这个没有做无效点判断,而上面那个底层是有判断的
5、组织有序的点云
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | // Setup the cloud using PointType = pcl::PointXYZ; using CloudType = pcl::PointCloud<PointType>; CloudType::Ptr cloud( new CloudType); // Make the cloud a 10x10 grid cloud->height = 10; cloud->width = 10; cloud->is_dense = true ; cloud->resize(cloud->height * cloud->width); // Output the (0,0) point std::cout << (*cloud)(0, 0) << std::endl; // Set the (0,0) point PointType p; p.x = 1; p.y = 2; p.z = 3; (*cloud)(0, 0) = p; // Confirm that the point was set std::cout << (*cloud)(0, 0) << std::endl; |
结果:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」