注:这些计算都都是只调Common中的公共函数,因此不单独写main()函数,
只通过控制台打印验证是否可以正常运行,结果是否正确,不做可视化展示,
使用时直接把代码拷贝进去就行。
1.判断点云中哪些点在box盒中
#include <pcl/common/common.h>
/****************读取点云********************/
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_in(new pcl::PointCloud<pcl::PointXYZ>);
pcl::io::loadPCDFile("D:/code/csdn/data/person3.pcd", *cloud_in); // 加载原始点云数据
// 计算
Eigen::Vector4f minPt = { 0,0,0,0 }, maxPt = { 40,40,40,0 };
pcl::Indices indices; // 处于box内部的点云点的索引
pcl::getPointsInBox(*cloud_in, minPt, maxPt, indices);
2.给定一个点,求距离该点最远的点云点
#include <pcl/common/common.h>
/****************读取点云********************/
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_in(new pcl::PointCloud<pcl::PointXYZ>);
pcl::io::loadPCDFile("D:/code/csdn/data/person3.pcd", *cloud_in); // 加载原始点云数据
// 计算
Eigen::Vector4f pointPt(0, 0, 0, 0), maxPtDis(0, 0, 0, 0);
pcl::getMaxDistance(*cloud_in, pointPt, maxPtDis); // 在所有点云中,寻找距离该点最远的点云点
Eigen::Vector4f pointPt1(0, 0, 0, 0), maxPtDis1(0, 0, 0, 0);
pcl::Indices indicesDis;
indicesDis.push_back(0); // 手动添加索引,实际应用中一般是计算得出的结果
indicesDis.push_back(1);
indicesDis.push_back(2);
indicesDis.push_back(3);
pcl::getMaxDistance(*cloud_in, indicesDis, pointPt, maxPtDis); // 在点云的这部分索引中,寻找距离该点最远的点云
3.获取给定点云点的最大最小XYZ值
#include <pcl/common/common.h>
/****************读取点云********************/
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_in(new pcl::PointCloud<pcl::PointXYZ>);
pcl::io::loadPCDFile("D:/code/csdn/data/person3.pcd", *cloud_in); // 加载原始点云数据
// 计算
Eigen::Vector4f minPt3DV(0, 0, 0, 0), maxPt3DV(0, 0, 0, 0);
pcl::getMinMax3D(*cloud_in, minPt3DV, maxPt3DV); // 获取给定点云点的最大最小值(vector形式保存)
Eigen::Vector4f minPt3DVI(0, 0, 0, 0), maxPt3DVI(0, 0, 0, 0);
pcl::Indices indices3dVI;
indices3dVI.push_back(0); // 手动添加索引,一般是计算得出的结果
indices3dVI.push_back(1);
indices3dVI.push_back(2);
indices3dVI.push_back(3);
pcl::getMinMax3D(*cloud_in, indices3dVI, minPt3DVI, maxPt3DVI); // 从点云的这部分索引中,获取给定点云点的最大最小值(vector形式保存)
pcl::PointXYZ minPt3DP, maxPt3DP;
pcl::getMinMax3D(*cloud_in, minPt3DP, maxPt3DP); // 获取给定点云点的最大最小值(pcl::pointType形式保存)
4.计算多边形点云的面积(多边形的顶点需要以逆时针排序)
#include <pcl/common/common.h>
pcl::PointCloud<pcl::PointXYZ>::Ptr cloudPol (new pcl::PointCloud<pcl::PointXYZ>); // 手动写入逆时针的多边形顶点
cloudPol->push_back(pcl::PointXYZ(1, 0, 0));
cloudPol->push_back(pcl::PointXYZ(-1, 0, 0));
cloudPol->push_back(pcl::PointXYZ(0, 2, 0));
float result = pcl::calculatePolygonArea(*cloudPol);
结果打印:
// 打印
std::cout << "判断点云点在box盒中(打印点个数):" << indices.size() << std::endl;
std::cout << "在点云中,给定一个点,求距离该点最远的点云点(打印最远点坐标):" << maxPtDis << std::endl;
std::cout << "获取给定点云点的最大值:" << maxPt3DV << std::endl;
std::cout << "获取给定点云点的最小值:" << minPt3DV << std::endl;
std::cout << "计算多边形点云的面积:" << result << std::endl;