【PCL】教程alignment_prerejective.cpp 刚性物体的鲁棒位姿估计

4b3542fb64fb78c3b09437562e51d8fc.png

The viewer window provides interactive commands; for help, press 'h' or 'H' from within the window.
> Loading V:\learn\PCL\pcl\examples\test\chef.pcd [PCLVisualizer::setUseVbos] Has no effect when OpenGL version is 鈮?2
[done, 327.147 ms : 5092 points]
Available dimensions: x y z normal_x normal_y normal_z

93cf69384d119764df6c4cd779e590e3.png

The viewer window provides interactive commands; for help, press 'h' or 'H' from within the window.
> Loading V:\learn\PCL\pcl\examples\test\rs1.pcd [PCLVisualizer::setUseVbos] Has no effect when OpenGL version is 鈮?2
[done, 376.229 ms : 289541 points]
Available dimensions: x y z

d5019cb7e36e1ae10128dd6ddaff5097.png

chef.pcd
rs1.pcd
> Loading point clouds...
Failed to find match for field 'curvature'.
Failed to find match for field 'normal_x'.
Failed to find match for field 'normal_y'.
Failed to find match for field 'normal_z'.
Failed to find match for field 'curvature'.
> Downsampling...
> Estimating scene normals...
> Estimating features...
> Starting alignment...
Alignment took 426.567ms.|  0.089 -0.994 -0.064 |
R = | -0.996 -0.088 -0.016 ||  0.010  0.065 -0.998 |t = < -0.097, 0.042, 0.068 >Inliers: 1443/3432

前言

在本教程中,我们将展示如何在具有杂乱和遮挡的场景中找到刚性对象的对齐姿势(alignment pose of a rigid object)

首先,下载测试模型:object (https://pcl.readthedocs.io/projects/tutorials/en/latest/_downloads/da6e6b8fbf78b559884f14174ad67c01/chef.pcd )和 scene(https://pcl.readthedocs.io/projects/tutorials/en/latest/_downloads/eb5b16fe36d0ec907bd4c65335af7cb7/rs1.pcd) 。

源码解析

这段代码是使用PCL库(点云库)和Eigen库来实现将一个刚性物体与一个包含杂乱无章和遮挡物的场景进行对齐的功能。下面是代码的详细解释和功能总结:

头文件引用:代码引用了Eigen库和PCL库的多个头文件,这些头文件为点云处理提供了基础结构、特征估计、过滤器、输入输出操作、注册方法和可视化工具。

类型定义:定义了多个别名,以简化代码中对特定类型的引用。包括点云、特征和颜色处理器的类型。

主函数(main):

  • 初始化点云和特征:首先,代码创建了几个指向点云和特征的智能指针。

  • 输入处理:检查命令行参数数量是否正确,如果不正确,则打印错误信息并返回。正确的语法需要包括目标对象和场景的PCD文件路径。

  • 加载点云:加载目标对象和场景的点云数据。如果加载失败,会打印错误信息并返回。

  • 下采样:使用体素网格(VoxelGrid)对目标对象和场景进行下采样,以减少点的数量并加快后续处理速度。

  • 估计法线:对场景点云估计法线,这是很多特征估计和配准方法的前提条件。

  • 特征估计:对目标对象和场景使用FPFH算法估计特征。该步骤为之后的配准过程提供必要的特征信息。

  • 执行对齐(配准):使用基于采样一致性的预拒绝配准方法对目标对象和场景进行对齐。该方法考虑了特征相似性,并尝试找到最优的变换矩阵,以将目标对象对齐到场景中。

  • 结果打印和可视化:如果配准成功,打印出变换矩阵和内点数量,并使用PCLVisualizer显示对齐结果。如果配准失败,则打印错误信息并返回。

功能总结:这段代码实现了一个3D对象与3D场景的精确对齐功能,包括点云加载、下采样、法线估计、特征估计和采样一致性预拒绝配准。成功对齐后,会显示对齐结果,并输出变换矩阵和内点信息。这对于在复杂场景中识别和定位特定对象非常有用。

#include <Eigen/Core> // 引入Eigen核心部分的头文件,用于进行矩阵等数学运算
#include <pcl/point_types.h> // 引入PCL库中点类型的定义
#include <pcl/point_cloud.h> // 引入PCL库中点云类型的定义
#include <pcl/common/time.h> // 引入PCL库中时间处理的功能
#include <pcl/console/print.h> // 引入PCL库的控制台打印功能,用于输出信息
#include <pcl/features/normal_3d_omp.h> // 引入PCL库中用于估计点云法线的功能
#include <pcl/features/fpfh_omp.h> // 引入PCL库中用于计算FPFH特征的功能
#include <pcl/filters/filter.h> // 引入PCL库中的滤波器功能
#include <pcl/filters/voxel_grid.h> // 引入PCL库中的体素网格滤波器,用于降采样
#include <pcl/io/pcd_io.h> // 引入PCL库中的点云数据输入输出功能
#include <pcl/registration/sample_consensus_prerejective.h> // 引入PCL库中进行样本一致性预拒绝配准的功能
#include <pcl/visualization/pcl_visualizer.h> // 引入PCL库中的点云可视化功能// 类型定义 我们首先定义便利类型,以免代码混乱。
typedef pcl::PointNormal PointNT; // 定义包含法线信息的点类型
typedef pcl::PointCloud<PointNT> PointCloudT; // 定义包含法线的点云类型
typedef pcl::FPFHSignature33 FeatureT; // 定义用于FPFH特征的数据结构
typedef pcl::FPFHEstimationOMP<PointNT,PointNT,FeatureT> FeatureEstimationT; // 定义FPFH特征估计器类型
typedef pcl::PointCloud<FeatureT> FeatureCloudT; // 定义存放FPFH特征的点云类型
typedef pcl::visualization::PointCloudColorHandlerCustom<PointNT> ColorHandlerT; // 定义用于点云颜色处理的类型// 与场景中的杂乱和遮挡进行刚体对齐
int main (int argc, char **argv) 
{// 点云定义//然后我们实例化必要的数据容器,检查输入参数并加载对象和场景点云。//尽管我们已经定义了包含法线的基本点类型,但我们只为对象预先定义了法线//(通常是这种情况)。我们将估计下面场景的法线信息。PointCloudT::Ptr object (new PointCloudT); // 定义待对齐的对象点云PointCloudT::Ptr object_aligned (new PointCloudT); // 定义对齐后的对象点云PointCloudT::Ptr scene_before_downsampling (new PointCloudT); // 定义降采样前的场景点云PointCloudT::Ptr scene (new PointCloudT); // 定义场景点云FeatureCloudT::Ptr object_features (new FeatureCloudT); // 定义对象点云的特征FeatureCloudT::Ptr scene_features (new FeatureCloudT); // 定义场景点云的特征// 获取输入对象和场景if (argc != 3){pcl::console::print_error ("Syntax is: %s object.pcd scene.pcd\n", argv[0]);return (1);}std::cout << argv[1] << endl;std::cout << argv[2] << endl;// 加载对象和场景pcl::console::print_highlight ("Loading point clouds...\n");if (pcl::io::loadPCDFile<PointNT> (argv[1], *object) < 0 ||pcl::io::loadPCDFile<PointNT> (argv[2], *scene_before_downsampling) < 0){pcl::console::print_error ("Error loading object/scene file!\n");return (1);}// 降采样 为了加快处理速度,我们使用 PCL 的 VoxelGrid 类// 将对象和场景点云下采样至 5 毫米的分辨率。pcl::console::print_highlight ("Downsampling...\n");pcl::VoxelGrid<PointNT> grid; // 创建体素网格滤波器const float leaf = 0.005f; // 定义体素大小grid.setLeafSize (leaf, leaf, leaf); // 设置体素大小grid.setInputCloud (object); // 设置输入点云为对象点云grid.filter (*object); // 执行滤波grid.setInputCloud (scene_before_downsampling); // 设置输入点云为场景点云grid.filter (*scene); // 执行滤波// 为场景估计法线// 现在使用 PCL 的 NormalEstimationOMP 来估计场景中缺失的表面法线。// 计算下面用于匹配的特征需要表面法线。pcl::console::print_highlight ("Estimating scene normals...\n");pcl::NormalEstimationOMP<PointNT,PointNT> nest; // 创建法线估计器nest.setRadiusSearch (0.005); // 设置搜索半径nest.setInputCloud (scene); // 设置输入点云nest.setSearchSurface (scene_before_downsampling); // 设置搜索表面nest.compute (*scene); // 执行法线估计// 估计特征//对于下采样点云中的每个点,我们现在使用 PCL 的 FPFHEstimationOMP 类// 来计算用于在对齐过程中进行匹配的快速点特征直方图 (FPFH) 描述符。pcl::console::print_highlight ("Estimating features...\n");FeatureEstimationT fest; // 创建FPFH特征估计器fest.setRadiusSearch (0.025); // 设置搜索半径//object同时包含每个点的位置和法线数据fest.setInputCloud (object); // 设置输入点云为对象点云fest.setInputNormals (object); // 设置输入法线 object同时包含每个点的位置和法线数据fest.compute (*object_features); // 计算对象点云的特征fest.setInputCloud (scene); // 设置输入点云为场景点云fest.setInputNormals (scene); // 设置输入法线为场景点云法线fest.compute (*scene_features); // 计算场景点云的特征// 执行对齐 我们现在准备好设置对齐过程。我们使用 // SampleConsensusPrerejective 类,它实现了高效的 RANSAC 位姿估计// 循环。这是通过使用 CorrespondenceRejectorPoly 类提前消除不良姿势// 假设来实现的。pcl::console::print_highlight ("Starting alignment...\n");pcl::SampleConsensusPrerejective<PointNT,PointNT,FeatureT> align; // 创建对齐器align.setInputSource (object); // 设置源点云align.setSourceFeatures (object_features); // 设置源点云特征align.setInputTarget (scene); // 设置目标点云align.setTargetFeatures (scene_features); // 设置目标点云特征align.setMaximumIterations (50000); // 设置RANSAC迭代次数align.setNumberOfSamples (3); // 设置采样点数align.setCorrespondenceRandomness (5); // 设置最近特征使用数align.setSimilarityThreshold (0.95f); // 设置边长相似度阈值align.setMaxCorrespondenceDistance (2.5f * leaf); // 设置内点阈值align.setInlierFraction (0.25f); // 设置接受一个姿态假设所需的内点比例{// 最后,我们准备好执行对齐过程。pcl::ScopeTime t("Alignment"); // 记录对齐时间align.align (*object_aligned); // 执行对齐}// 对齐的对象存储在点云object_aligned中。// 如果找到具有足够内点的姿势(超过对象点总数的 25%),// 则称算法收敛,我们可以打印和可视化结果。if (align.hasConverged ())//在最后一次对齐运行之后返回收敛状态{// 打印结果printf ("\n");Eigen::Matrix4f transformation = align.getFinalTransformation (); // 获取最终变换矩阵pcl::console::print_info ("    | %6.3f %6.3f %6.3f | \n", transformation (0,0), transformation (0,1), transformation (0,2));pcl::console::print_info ("R = | %6.3f %6.3f %6.3f | \n", transformation (1,0), transformation (1,1), transformation (1,2));pcl::console::print_info ("    | %6.3f %6.3f %6.3f | \n", transformation (2,0), transformation (2,1), transformation (2,2));pcl::console::print_info ("\n");pcl::console::print_info ("t = < %0.3f, %0.3f, %0.3f >\n", transformation (0,3), transformation (1,3), transformation (2,3));pcl::console::print_info ("\n");pcl::console::print_info ("Inliers: %i/%i\n", align.getInliers ().size (), object->size ());// 显示对齐结果pcl::visualization::PCLVisualizer visu("Alignment"); // 创建可视化器visu.addPointCloud (scene, ColorHandlerT (scene, 0.0, 255.0, 0.0), "scene"); // 添加场景点云visu.addPointCloud (object_aligned, ColorHandlerT (object_aligned, 0.0, 0.0, 255.0), "object_aligned"); // 添加对齐后的对象点云visu.spin (); // 开始交互式可视化}else{pcl::console::print_error ("Alignment failed!\n"); // 打印对齐失败信息return (1);}return (0);
}

该代码是用于进行三维点云之间的刚体对齐的程序,主要实现了以下功能:

  • 加载指定的对象(待对齐的模型)点云和场景(环境中的模型)点云。

  • 对对象和场景点云进行降采样以提高处理效率

  • 场景点云估计法线,这通常是对齐和其他点云处理任务的先决条件。

  • 对象和场景点云计算FPFH(Fast Point Feature Histograms)特征,这是一种描述点云局部几何特征的方法。

  • 使用样本一致性预拒绝算法对对象点云进行刚体对齐到场景点云,即定位对象在场景中的位置和姿态。

  • 输出对齐后的变换矩阵,并可视化对齐结果。

visu.addPointCloud (object_aligned, ColorHandlerT (object_aligned, 0.0, 0.0, 255.0), "object_aligned");

023fc54db8bde05875e749170382d024.png

FPFH特征及其估计器

92dc67838210c98c4b0a491db42e09b0.png

c498c4b799126f488f304a3af514509d.png

PCL 的体素网格滤波器

5ea4f26a7422212bd7e6cb0031fafe7a.png

法线估计器 pcl::NormalEstimationOMP

7220755c18c6c4efa2abeadede72d52d.png

pcl::SampleConsensusPrerejective 及对齐过程

32523d303d0ae8f1b38a4473403f15c4.png

aligner.getFinalTransformation();的物理意义是什么?
是对象坐标系位姿相对于场景坐标系位姿的坐标表示吗?

037d5458d0bdc1184fcc67d1402d9944.png

align.setInlierFraction(0.25f);

8953b07ab912e2cc6bfc17752dea9c15.png

调试时设置argv参数

8a3727f9340441671d0cdfa6332e2647.png

e804891bbbbbfbb49946fb9c614293fc.png

int
fake_main(int argc, char** argv);int main() {// 手动设置命令行参数const char* arguments[] = { "chef.pcd", "rs1.pcd"};int argument_count = sizeof(arguments) / sizeof(char*);// 调用 fake_main 并传递参数fake_main(argument_count, const_cast<char**>(arguments));return 0;
}// Align a rigid object to a scene with clutter and occlusions
//https://pcl.readthedocs.io/projects/tutorials/en/latest/alignment_prerejective.html#alignment-prerejective
int
fake_main (int argc, char **argv)
{
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/320.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI大模型量化格式介绍(GPTQ,GGML,GGUF,FP16/INT8/INT4)

在 HuggingFace 上下载模型时&#xff0c;经常会看到模型的名称会带有fp16、GPTQ&#xff0c;GGML等字样&#xff0c;对不熟悉模型量化的同学来说&#xff0c;这些字样可能会让人摸不着头脑&#xff0c;我开始也是一头雾水&#xff0c;后来通过查阅资料&#xff0c;总算有了一些…

DFS之剪枝(上交考研题目--正方形数组的数目)

题目 给定一个非负整数数组 A A A&#xff0c;如果该数组每对相邻元素之和是一个完全平方数&#xff0c;则称这一数组为正方形数组。 返回 A A A 的正方形排列的数目。 两个排列 A 1 A1 A1 和 A 2 A2 A2 不同的充要条件是存在某个索引 i i i&#xff0c;使得 A 1 [ i …

测试一下 Meta Llama3-70b-Instruct-q8

测试一下 Meta Llama3-70b-Instruct-q8 0. 引言1. 测试 Meta Llama3-70b-Instruct-q8 0. 引言 今天&#xff0c;Meta 正式介绍Meta Llama 3&#xff0c;Meta 开源大型语言模型的下一代产品。 这次发布包括具有80亿&#xff08;8B&#xff09;和700亿&#xff08;70B&#xff0…

指纹浏览器如何高效帮助TikTok账号矩阵搭建?

TikTok的账号矩阵&#xff0c;可能听起来还比较陌生&#xff0c;但随着TikTok业务已经成为吃手可热的跨境业务&#xff0c;TikTok多账号矩阵已成为流行策略。但它有什么优点呢&#xff1f;操作多个帐户会导致被禁止吗&#xff1f;如何有效地建立账户矩阵开展业务&#xff1f;这…

CANfestival 主机进入预操作态(preOperational)自动发送复位节点指令。

核心是iam_a_slave ,这个是字典生产的时候自动生成的。

【Flutter】多语言方案一:flutter_localizations 与 GetX 配合版

系列文章目录 多语言方案&#xff1a;flutter_localizations 与 GetX 配合版&#xff0c;好处&#xff1a;命令行生成多语言字符串的引用常量类&#xff0c;缺点&#xff1a;切换语言以后&#xff0c;主界面需要手动触发setState&#xff0c;重绘将最新的Locale数据设置给GetM…

使用LangChain和Llama-Index实现多重检索RAG

大家好&#xff0c;在信息检索的世界里&#xff0c;查询扩展技术正引领着一场效率革命。本文将介绍这一技术的核心多查询检索&#xff0c;以及其是如何在LangChain和Llama-Index中得到应用的。 1.查询扩展 查询扩展是一种信息检索技术&#xff0c;通过在原始查询的基础上增加…

基于Springboot的简历系统

基于SpringbootVue的简历系统的设计与实现 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringbootMybatis工具&#xff1a;IDEA、Maven、Navicat 系统展示 用户登录 首页 简历模板 招聘会 求职论坛 系统公告 后台登录 后台首页 用户管理 简历模板 模板…

uniapp中scroll-view初始化的时候 无法横向滚动到某个为止

项目需求 实现日历&#xff08;13天&#xff09;默认高亮第六天 并定位到第六 左边右边各六天&#xff08;可以滑动&#xff09; 直接上代码 <template><scroll-view class"scroll-X":show-scrollbar"true" :scroll-x"scrollable":…

OpenHarmony网络组件-Mars

项目简介 Mars 是一个跨平台的网络组件&#xff0c;包括主要用于网络请求中的长连接&#xff0c;短连接&#xff0c;是基于 socket 层的解决方案&#xff0c;在网络调优方面有更好的可控性&#xff0c;暂不支持HTTP协议。 Mars 极大的方便了开发者的开发效率。 效果演示 编译…

产废端实时音视频监控系统在运输车辆驾驶室中的应用

实时音视频监控系统可通过在运输车辆驾驶室安装音视频摄录设备&#xff0c;实现将运输车辆内部及周围环境音视频数据通过移动网络实时回传指挥中心的功能。 前端摄录设备主要负责采集车内外的视音频信息&#xff0c;为了保障车辆及运输人员 的安全&#xff0c;应合理选择摄录设…

【多线程】定时器 | 线程池 | 实现MyTimer | 实现MyThreadPoll | 工厂模式 | 构造方法 | 参数种类

文章目录 定时器&线程池一、定时器1.标准库中的定时器2.实现定时器 二、线程池1.线程池的概念线程池&#xff1a; 2.标准库当中的线程池工厂模式 Executors 创建线程池1.自适应线程池2.固定数量线程池3.只有单个线程的线程池4.设定延迟时间后执行命令的线程池 ThreadPoolEx…

BNB链融合

BNB Chain融合 BNB Chain目前有BNB智能链&#xff08;BSC&#xff09;&#xff0c;BNB信标链 BNB信标链&#xff1a;用作质押和投票的治理层&#xff0c;采用BEP-2代币标准BNB智能链(BSC)&#xff1a;用作EVM兼容层&#xff0c;提供DApp、DeFi服务、共识层、多链支持和其他Web3…

阿里云服务器上配置Docker 以及常用命令讲解

目录 一、认识docer二、在阿里云服务器上配置Docker三、底层原理4、常用命令&#xff08;1&#xff09;Docker中常见镜像命令&#xff08;2&#xff09;Docker中常见容器命令&#xff08;3&#xff09;日志查看命令&#xff08;4&#xff09;进入容器的命令与拷贝命令 一、认识…

【目标检测】Focal Loss

Focal Loss用来解决正负样本不平衡问题&#xff0c;并提升训练过程对困难样本的关注。 在一阶段目标检测算法中&#xff0c;以YOLO v3为例&#xff0c;计算置信度损失&#xff08;图中第3、4项&#xff09;时有目标的点少&#xff0c;无目标的点多&#xff0c;两者可能相差百倍…

【1524】java投票管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java 投票管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0&…

Rust入门-所有权与借用

一、为什么、是什么、怎么用 1、为什么Rust要提出一个所有权和借用的概念 所有的程序都必须和计算机内存打交道&#xff0c;如何从内存中申请空间来存放程序的运行内容&#xff0c;如何在不需要的时候释放这些空间&#xff0c;成为所有编程语言设计的难点之一。 主要分为三种…

java新冠病毒密接者跟踪系统(springboot+mysql源码+文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的新冠病毒密接者跟踪系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 新冠病毒密接者跟…

Java垃圾回收1

1.对象什么时候可以被垃圾器回收 1.垃圾回收的概念 为了让程序员更专注于代码的实现&#xff0c;而不用过多的考虑内存释放的问题&#xff0c;所以&#xff0c; 在Java语言中&#xff0c;有了自动的垃圾回收机制&#xff0c;也就是我们熟悉的GC(Garbage Collection)。 有了垃圾…

2、MATLAB入门常用命令

一、退出和中断 exit和quit&#xff1a;结束MATLAB会话。程序完成&#xff0c;如果没有明确保存&#xff0c;则变量中的数据丢失。 Ctrl c&#xff1a;中断一个MATLAB任务。例如&#xff0c;当MATLAB正在计算或打印时&#xff0c;中断一个任务&#xff0c;但会话并没有结束。…