目录
1.什么是点云的分辨率
点云的分辨率也叫点云密度,点云密度是数据分辨率的指标:较高的密度意味着更多的信息(高分辨率),而较低的密度意味着较少的信息(低分辨率)。了解点云密度很重要,因为这可能会影响基于点云的其他项目的质量或准确性。
点云的分辨率有很多是基于某点去查询最近点,根据最近点的距离去代替点云的密度,但是这种是不稳定的,对于有噪声和有空洞的点云来说,可能是不准确的,所以利用整个点云去查找最近点进行平均的方法是具有较高的稳定性和鲁棒性的;
2.代码实现
#define BOOST_TYPEOF_EMULATION
#include <iostream>
#include <vector>
#include <pcl/io/ply_io.h>
#include <pcl/point_types.h>
#include <pcl/kdtree/kdtree_flann.h> //kdtree近邻搜索
#include <pcl/registration/ia_fpcs.h>
using namespace std;
float CalculateDensity(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud) {
float mr = 0;
pcl::KdTreeFLANN<pcl::PointXYZ> kdtree;
vector<int>pointIdx(2);
vector<float>pointDst(2);
kdtree.setInputCloud(cloud);
pcl::PointXYZ query_point;
for (int i = 0; i < cloud->points.size(); i++)
{
query_point = cloud->points[i];
kdtree.nearestKSearch(query_point, 2, pointIdx, pointDst);
float x = cloud->points[pointIdx[0]].x - cloud->points[pointIdx[1]].x;
float y = cloud->points[pointIdx[0]].y - cloud->points[pointIdx[1]].y;
float z = cloud->points[pointIdx[0]].z - cloud->points[pointIdx[1]].z;
float mr_temp = sqrt(x * x + y * y+ z * z );
mr += mr_temp;
}
mr /= cloud->points.size();
return mr;
}
int main()
{
// --------------------------------读取点云------------------------------------
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
if (pcl::io::loadPLYFile<pcl::PointXYZ>("banShou.ply", *cloud) == -1)
{
PCL_ERROR("Cloudn't load pointCloud file!");
return -1;
}
float density = 0;
density = CalculateDensity(cloud);
//基于PCL库的点云分辨率计算 pcl内置函数内置多线程加速
float dist_max = 100.0;
std::vector <int> indices;
for (int i = 0; i < cloud->points.size(); i++)
{
indices.push_back(i);
}
float Density = pcl::getMeanPointDensity<pcl::PointXYZ>(cloud, indices, dist_max, 8);//8个线程
cout << "点云的分辨率为:" << density << "mm" << endl;
cout << "点云分辨率为为:" << Density << "mm" << endl;
return 0;
}