欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 能源 > PCL-选择ROI区域

PCL-选择ROI区域

2025/2/24 23:21:06 来源:https://blog.csdn.net/wfengzi5/article/details/144224060  浏览:    关键词:PCL-选择ROI区域

PCL-基于四个坐标点选择ROI区域

  • 一、项目背景
  • 二、代码实现
  • 三、效果演示
  • 四、相关链接

点云数据由大量空间中的三维点组成,这些点包含了物体的形状、位置和表面信息。在本文中,我们将介绍如何使用PCL中的CropBox函数来加载、裁剪和可视化点云数据,具体的,提前在CC中选择好 四个坐标点,并提前设置好ROI区域的高度,然后在原点云中裁剪出立体框,即ROI区域。

一、项目背景

假设我们有一个机器人卸货的应用场景,需要对一组砖块的点云数据进行处理。我们的目标是从原始点云数据中裁剪出一个特定区域,以便进行后续的分析或处理。

二、代码实现

头文件如下:

#include <iostream>
#include <pcl/point_cloud.h>
#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/filters/crop_box.h>
#include <Eigen/Dense>
#include <pcl/visualization/cloud_viewer.h>

1. 创建点云对象并加载数据
首先,我们需要创建一个新的点云对象,并加载存储在文件系统中的点云数据。

pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
if (pcl::io::loadPCDFile<pcl::PointXYZ>("***.pcd", *cloud) == -1) {PCL_ERROR("Couldn't read file input.pcd \n");return -1;
}

这里,我们使用pcl::io::loadPCDFile函数从指定路径加载点云数据。如果文件读取失败,程序将输出错误信息并返回。

2. 定义裁剪区域的四个点
接下来,我们定义了四个点来定义一个裁剪区域。这四个点将形成一个矩形平面,用于裁剪点云数据。

Eigen::Vector3f point1(***, ****, ****); //右上
Eigen::Vector3f point2(***, ****, ****); //左上
Eigen::Vector3f point3(***, ****, ****); //右下
Eigen::Vector3f point4(***, ****, ****); //左下

3. 计算裁剪平面的法向量和方程
为了裁剪点云,我们需要定义一个平面。这个平面由上面定义的四个点确定。我们首先计算平面的法向量,然后计算平面方程的参数。

// 计算平面的法向量
Eigen::Vector3f normal = (point2 - point1).cross(point3 - point1).normalized();
// 设定平面方程的d
float d = -normal.dot(point1);

4. 设置裁剪框并裁剪点云
在PCL中,pcl::CropBox类用于裁剪点云数据。我们根据定义的四个点设置裁剪框的范围,并执行裁剪操作。

pcl::CropBox<pcl::PointXYZ> crop_box;Eigen::Vector4f min_point, max_point;
min_point << std::min({ point1[0], point2[0], point3[0], point4[0] }),std::min({ point1[1], point2[1], point3[1], point4[1] }),0, 1;max_point << std::max({ point1[0], point2[0], point3[0], point4[0] }),std::max({ point1[1], point2[1], point3[1], point4[1] }),1380, 1;crop_box.setMin(min_point);
crop_box.setMax(max_point);
crop_box.setInputCloud(cloud);pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_cropped(new pcl::PointCloud<pcl::PointXYZ>);
crop_box.filter(*cloud_cropped);

5. 可视化裁剪后的点云
最后,我们使用PCL的可视化工具来显示裁剪后的点云数据。

pcl::visualization::CloudViewer viewer("Cloud Viewer");
viewer.showCloud(cloud_cropped);while (!viewer.wasStopped()) {// 你可以在这里对点云做很多处理
}

三、效果演示

在这里插入图片描述

四、相关链接

PCL交互选择ROI区域

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词