PCL显示点云基本信息

        【版权声明】
本文为博主原创文章,未经博主允许严禁转载,我们会定期进行侵权检索。 

        随着三维数据在计算机视觉和机器人领域的广泛应用,点云数据成为了一个重要的数据形式,而PCL(Point Cloud Library)则是一个用于处理点云数据的强大库。当你需要在处理点云数据时,了解点云的基本信息是非常重要的。在这篇博文中,我们将介绍一个用于打印点云基本信息的函数pcdinfo_print,该函数可以帮助你快速获取点云的大小、边界、三维尺寸、质心坐标和平均密度等信息。

1 示例程序

        示例点云rabbit.pcd下载地址为https://download.youkuaiyun.com/download/suiyingy/85129456。

/*
更多python与C++技巧、三维算法、深度学习算法总结、大模型请关注我的博客,欢迎讨论与交流:https://blog.youkuaiyun.com/suiyingy,或”乐乐感知学堂“公众号。Python三维领域专业书籍推荐:《人工智能点云处理及深度学习算法》。
*/
#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
#include <pcl/common/common.h>
#include <pcl/features/normal_3d.h>


using namespace std;
// 打印点云基本信息
// 打印点云基本信息
void pcdinfo_print(pcl::PointCloud<pcl::PointXYZ>::Ptr pcd, std::string prefix = "原始点云") {
    Eigen::Vector4f lb, ub, cr;
    pcl::getMinMax3D(*pcd, lb, ub);
    pcl::compute3DCentroid(*pcd, cr);
    float density = pcd->points.size() / ((ub - lb).head<3>().prod());
    std::cout << "[info] " << prefix << "数量:" << pcd->size() << std::endl;
    std::cout << "[info] " << prefix << "下边界:" << lb << std::endl;
    std::cout << "[info] " << prefix << "上边界:" << ub << std::endl;
    std::cout << "[info] " << prefix << "三维尺寸:" << ub - lb << std::endl;
    std::cout << "[info] " << prefix << "质心坐标:" << cr << std::endl;
    std::cout << "[info] " << prefix << "平均密度:" << density << std::endl;
}

int main (int argc, char** argv)
{
  // 读取.pcd文件
  pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
  if (pcl::io::loadPCDFile<pcl::PointXYZ> ("../../rabbit.pcd", *cloud) == -1) //* 读入PCD文件
  {
    PCL_ERROR ("Couldn't read file example_cloud.pcd \n");
    return (-1);
  }
  std::cout << "Loaded "
            << cloud->width * cloud->height
            << " data points from rabbit.pcd with the following fields. "
            << std::endl;
  pcdinfo_print(cloud, "原始点云");

  return 0;
}

        运行结果如下所示。

2 程序解析

        首先,让我们看一下`pcdinfo_print`函数的代码实现。这个函数接受一个`pcl::PointCloud<pcl::PointXYZRGB>::Ptr`类型的指针作为输入,以及一个可选的前缀字符串用于标识点云数据。函数内部使用PCL库提供的函数来计算点云的最小最大边界、三维尺寸、质心坐标和平均密度,并将这些信息打印到控制台上。

        接下来,我们可以逐步解释这个函数的功能和输出结果:

        pcd->size():打印点云的大小,即点云中点的个数。

        lb和ub:分别代表点云的下边界和上边界,通过这两个向量可以了解点云数据的空间范围。

        ub - lb:计算点云的三维尺寸,即点云数据在三个坐标轴上的长度、宽度和高度。

        cr:计算点云的质心坐标,表明点云数据的中心位置。

        density:计算点云的平均密度,即点云中点的数量除以点云体积。

        通过调用`pcdinfo_print`函数,你可以轻松地获取并打印出点云数据的关键信息,帮助你更好地理解和分析点云数据。这对于点云处理、特征提取和模型构建都具有重要意义。

        总的来说,了解如何获取和打印点云的基本信息是点云处理中的基础工作,而`pcdinfo_print`函数提供了一个简洁而有效的方法来实现这一目的。希朝这篇博文能够帮助你更好地理解点云数据的特性和结构,进一步深入研究点云相关的应用领域。

【版权声明】
本文为博主原创文章,未经博主允许严禁转载,我们会定期进行侵权检索。 
 

更多python与C++技巧、三维算法、深度学习算法总结、大模型请关注我的博客,欢迎讨论与交流:https://blog.youkuaiyun.com/suiyingy,或”乐乐感知学堂“公众号。Python三维领域专业书籍推荐:《人工智能点云处理及深度学习算法》。

PCL (Point Cloud Library) 是一个用于处理点云数据的开源库,常用于计算机视觉和机器人技术。要在 C++ 中使用 PCL显示点云中心(通常是重心或质心)和比例(比如最大值、最小值等),你可以按照以下步骤操作: 1. 首先,确保你已经安装了 PCL,并且熟悉基本的数据结构如 `pcl::PointCloud<pcl::PointXYZ>` 或其他适合你的点云类型。 2. 加载和准备点云数据: ```cpp pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>); // 加载点云数据 pcl::io::loadCloud (cloud_file, *cloud); ``` 3. 计算点云中心(通常使用 `pcl:: statistical_outlier_removal` 滤波器计算质心): ```cpp pcl::search::KdTree<pcl::PointXYZ>::Ptr tree (new pcl::search::KdTree<pcl::PointXYZ>); pcl::MeanShift<pcl::PointXYZ> mean_shift; mean_shift.setInputCloud (cloud); mean_shift.setSearchMethod (tree); mean_shift.process (*cloud); pcl::PointXYZ center = mean_shift.getMean(); ``` 4. 获取点云的比例信息,这里可以取最大值和最小值作为尺度示例: ```cpp pcl::PointMinMax min_max; min_max.setInputCloud(cloud); min_max.compute(*cloud); double max_range = std::max(std::abs(min_max.max.x), std::max(std::abs(min_max.max.y), std::abs(min_max.max.z))); double min_range = std::min(std::abs(min_max.min.x), std::min(std::abs(min_max.min.y), std::abs(min_max.min.z))); ``` 5. 显示结果: 可能需要借助于可视化库(如 VTK、PCL visualizer 或第三方库)来展示点云及其中心和比例,这一步取决于你的具体需求和环境设置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Coding的叶子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值