SUPER 4PCS配准

news2024/11/16 8:19:00

一、下载编译

1、下载

链接:STORM-IRIT/OpenGR: OpenGR: A C++ library for 3D Global Registration (github.com)

不过有部分代码不能成功下载,要到该文件夹再次下载,就是下面标黄的两个文件,下载之后首先解压OpenGR-master.zip,再解压happly.zip和stb.zip放到OpenGR-master相对应的位置

把stb、happly和Eigen删除,再把解压出来的stb-e6afb9cbae4064da8c3e69af3ff5c4629579c1d2和happly-cfa2611550bc7da65855a78af0574b65deb81766文件名改成 stb和happly

 建立build和Lib两个文件夹

我这里有下载好的 OpenGR、包括stb和happly资源-CSDN文库

2、编译 

首先是你已经安装了PCL和opencv,PCL自带Eigen

打开cmake,把标黄的选项勾上

点击configure,写上x64,点击Finish

 配置前

修改这两处就行

点击Generate,然后点击Open_Project ,打开visual studio2022,点击生成,找到批生成

 把ALL_BUILD的Release|x64以及INSTALL的Release|x64给点上,最后点击生成,生成结束之后Lib文件夹会有这些文件

生成结束之后把这几个文件夹放到合适的地方,我放到了C:\Compiler\PCL\PCL 1.14.0\3rdParty\OpenGR文件夹下,其他的源码、build都可以删掉了

新建visual studio2022项目 ,新建这两个配置,一个是PCL的配置,第二个是SUPER 4PCS和opencv的配置,顺序不能乱,不然会报错

PCL的配置就不说了,展示一下 SUPER 4PCS和opencv的配置

二、代码 

C++

#include <gr/algorithms/match4pcsBase.h>
#include <gr/algorithms/FunctorSuper4pcs.h>
#include <pcl/registration/super4pcs.h>
#include <pcl/point_types.h>
#include <pcl/io/ply_io.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/registration/ia_fpcs.h>
#include <pcl/registration/ia_kfpcs.h>
#include <time.h>
#include <boost/thread/thread.hpp>

typedef pcl::PointXYZ PointT;
typedef pcl::PointCloud<PointT> PointCloud;

void visualize_pcd(PointCloud::Ptr icp_result, PointCloud::Ptr cloud_target)
{
	//创建初始化目标
	pcl::visualization::PCLVisualizer viewer("registration Viewer");
	pcl::visualization::PointCloudColorHandlerCustom<PointT> final_h(icp_result, 0, 255, 0);
	pcl::visualization::PointCloudColorHandlerCustom<PointT> tgt_h(cloud_target, 255, 0, 0);
	viewer.setBackgroundColor(0, 0, 0);
	viewer.addPointCloud(cloud_target, tgt_h, "tgt cloud");
	viewer.addPointCloud(icp_result, final_h, "final cloud");

	while (!viewer.wasStopped())
	{
		viewer.spinOnce(100);
		boost::this_thread::sleep(boost::posix_time::microseconds(100000));
	}
}

int main(int argc, char** argv)
{
	//加载点云文件
	PointCloud::Ptr cloud_source(new PointCloud);
	PointCloud::Ptr cloud_target(new PointCloud);

	if (pcl::io::loadPLYFile<pcl::PointXYZ>("pcd/bun_zipper.ply", *cloud_source) == -1)//*打开点云文件

	{
		PCL_ERROR("Couldn't read file source\n");
		return(-1);
	}

	if (pcl::io::loadPLYFile<pcl::PointXYZ>("pcd/bun_zipper2.ply", *cloud_target) == -1)//*打开点云文件

	{
		PCL_ERROR("Couldn't read file source\n");
		return(-1);
	}
	visualize_pcd(cloud_source, cloud_target);
	
	//四点法配准
	pcl::Super4PCS<pcl::PointXYZ, pcl::PointXYZ>sfpcs;
	sfpcs.setInputSource(cloud_source);
	sfpcs.setInputTarget(cloud_target);
	sfpcs.setOverlap(0.99);
	sfpcs.setDelta(0.005);//增量
	sfpcs.setMaxTimeSeconds(10000);//最大计算时间
	sfpcs.setMaxCorrespondenceDistance(0.5);
	sfpcs.align(*cloud_source);
	


	visualize_pcd(cloud_source, cloud_target);
	return (0);

}

 关键代码解析:

	pcl::Super4PCS<pcl::PointXYZ, pcl::PointXYZ>sfpcs;
	sfpcs.setInputSource(cloud_source);
	sfpcs.setInputTarget(cloud_target);
	sfpcs.setOverlap(0.99);
	sfpcs.setDelta(0.005);//增量
	sfpcs.setMaxTimeSeconds(10000);//最大计算时间
	sfpcs.setMaxCorrespondenceDistance(0.5);
	sfpcs.align(*cloud_source);
  1. pcl::Super4PCS<pcl::PointXYZ, pcl::PointXYZ> sfpcs;:创建了一个 Super4PCS 对象,用于点云的配准。

  2. sfpcs.setInputSource(cloud_source);:设置输入源点云,cloud_source 可能是一个 pcl::PointCloud<pcl::PointXYZ> 类型的点云数据。

  3. sfpcs.setInputTarget(cloud_target);:设置目标点云,cloud_target 也是一个 pcl::PointCloud<pcl::PointXYZ> 类型的点云数据。

  4. sfpcs.setOverlap(0.99);:设置匹配的重叠率。这个值介于 0 到 1 之间,表示匹配过程中两个点云之间的重叠程度。设置为 0.99 表示非常高的重叠率,这可能会导致更准确的匹配结果,但也可能增加计算时间。

  5. sfpcs.setDelta(0.005);:设置增量。增量控制算法在搜索空间中的步长或精度。较小的增量可能导致更精确的结果,但也可能导致更长的计算时间。

  6. sfpcs.setMaxTimeSeconds(10000);:设置最大计算时间,单位是秒。这个参数控制了算法的最大运行时间,避免了算法长时间运行而无法终止。

  7. sfpcs.setMaxCorrespondenceDistance(0.5);:设置最大对应距离。这个值表示两个点云中的点之间允许的最大距离,超过这个距离的点将不会被考虑在内。较大的值可能允许更大的误差,但也可能导致错误的匹配。

  8. sfpcs.align(*cloud_source);:调用 Super4PCS 算法的 align() 函数,将输入源点云与目标点云进行配准。配准的结果将会存储在输入源点云 cloud_source 中。

这些参数的设置会影响配准结果的准确性、计算时间以及内存消耗。需要根据具体的应用需求和点云数据特点来调整这些参数以获得最佳的配准效果。

结果:

配准前

配准后,十分出色

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

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

相关文章

南京观海微电子----Verilog基础(一)——数据类型、运算符

1. 数据类型 1.1 常量 整数&#xff1a;整数可以用二进制b或B&#xff0c;八进制o或O&#xff0c;十进制d或D&#xff0c;十六进制h或H表示&#xff0c;例如&#xff0c;8’b00001111表示8位位宽的二进制整数&#xff0c;4’ha表示4位位宽的十六进制整数。 X和Z&#xff1a;X…

Excel MATCH函数 两张顺序不同表格,统一排序

目录 一. 背景二. 添加辅助列,使用MATCH函数生成排序条件三. 效果 一. 背景 有如下图所示的两张表格&#xff0c;分别记录着同一批人的1月份和2月份的工资。表格A和表格B中的姓名列相同&#xff0c;工资列数据不同现在要求参考表格A中的姓名列对表格B中的数据进行排序&#xf…

机器学习:数据处理基操

在处理完数据之后&#xff0c;选择好模型&#xff0c;就可以用训练集训练模型&#xff0c;用测试集输入模型 然后输出需要预测的结果啦&#xff5e; 一、模块导入 import numpy as np import pandas as pd #读入数据 二、pandas数据 一、dataframe基础 一、dataframe的创建…

latex中\documentclass[preprint,review,12pt]{elsarticle}的详细解释

在LaTeX中&#xff0c;\documentclass 是一个命令&#xff0c;用于指定文档所使用的文档类。文档类定义了文档的总体结构、格式和样式。elsarticle 是一个常用的文档类&#xff0c;它主要用于在Elsevier出版的期刊上提交论文。 详细解释 \documentclass[preprint,review,12pt…

【Linux】ecs 挂载分区

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;Linux ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 详细步骤&#xff1a; 结语 我的其他博客 前言 在Linux系统中&#xff0c;挂载分区是连接额外存储空间到文件系统的重要步骤之一…

【转载】深度学习笔记——详解损失函数

原文链接: https://blog.csdn.net/weixin_53765658/article/details/136360033 CSDN账号: Purepisces github账号: purepisces 希望大家可以Star Machine Learning Blog https://github.com/purepisces/Wenqing-Machine_Learning_Blog 损失函数 根据您使用的神经网络类型和数…

kubectl 命令行管理K8S(下)

目录 声明式资源管理方式 介绍 命令 修改yaml文件指定的资源 离线修改 在线修改 YAML 语法格式 查看 api 资源版本标签 编辑yaml配置清单生成资源 编写yaml文件 yaml创建Deployment yaml创建service服务对外提供访问并测试 yaml创建Pod 生成模板 pod模板 serivc…

【降维算法UMAP】调参获得更适合的低维图

目录 UMAP降维介绍 UMAP的主要步骤 1. 学习高维空间中数据点间的距离 2. 构建高维图 local_connectivity参数 n_neighbors参数 3. 构建低维图 计算最小距离 min_dist超参数 最小化成本函数 R语言中的RunUMAP函数 关键参数 Reference UMAP降维介绍 为什么要降维&am…

最长上升子序列(LIS)简介及其例题分析

一.最长上升子序列&#xff08;LIS&#xff09;的相关知识 1.最长上升子序列&#xff08;Longest Increasing Subsequence&#xff09;&#xff0c;简称LIS&#xff0c;也有些情况求的是最长非降序子序列&#xff0c;二者区别就是序列中是否可以有相等的数。假设我们有一个序…

[数据结构]栈

1.栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出的原则。 压栈&#xff1a;栈的插入操作叫做进栈/压栈/入栈&#…

【UEFI实战】BIOS中的openssl

BIOS中的openssl openssl是一个密码库或者密码工具&#xff0c;在密码学基础_hex string is too short, padding with zero bytes t-CSDN博客介绍了基本的密码学概念已经openssl工具的使用&#xff0c;而这里将介绍BIOS下如何使用openssl。 在开源的BIOS代码库EDK中包含一个C…

数据结构作业复盘1:字符串疑难杂症小汇总(字符串赋值,指针数组...)

学校里开始上数据结构了&#xff0c;一开始是从C语言一些相关的基础开始讲起。第一次作业主要是字符串相关的基础知识以及编程题目。先做了一部分&#xff0c;整理了一下一些字符串隐含的知识和一些易误易混的概念&#xff0c;算是给自己的一个复盘和归纳。 strcpy函数相关 首…

Linux系统编程之多线程

目录 1、进程与线程 2、线程的优势与使用理由 3、多线程的使用 3.1 线程的使用 1.线程创建函数 2.线程退出函数 3.线程的等待 4.线程脱离 5. 线程ID获取及比较 6.示例 3.2 互斥锁的应用 1.互斥锁相关API 2.示例 3.3 条件变量的使用 1. 创建及销毁条件变量 2. 等待…

数字化转型导师坚鹏:证券公司数字化领导力提升之道

证券公司数字化领导力提升之道 ——融合中西智慧&#xff0c;践行知行合一思想&#xff0c;实现知行果合一 课程背景&#xff1a; 很多证券公司存在以下问题&#xff1a; 不知道证券公司数字化思维如何提升&#xff1f; 不清楚证券公司数字化领导力模型内涵&#xff1f;…

加密与安全_探索数字证书

文章目录 Pre概述使用keytool生成证书使用Openssl生成证书 &#xff08;推荐&#xff09;证书的吊销小结 Pre PKI - 借助Nginx 实现Https 服务端单向认证、服务端客户端双向认证 PKI - 04 证书授权颁发机构&#xff08;CA&#xff09; & 数字证书 PKI - 数字签名与数字证…

土壤侵蚀量化评估

根据之前的文章,已经算出了R、K、LS、C、P 现在计算土壤侵蚀,将几个前期制作好的因子的TIFF文件,用栅格计算器相乘 发现局部地区存在轻度侵蚀,大部分区域是微度侵蚀 然后对比了一下范围 其中的几个因子都在文献范围内,说明计算结果并未出错,可能就是研究区正常范围和结…

《数字图像处理(MATLAB版)》相关算法代码及其分析(1)

目录 1 自适应中值滤波算法 1.1 函数定义 1.2 输入参数检查 1.3 初始化 1.4 自适应中值滤波过程 1.5 处理剩余未处理的像素 1.6 总结 2 计算输入数组的平均值 2.1 函数定义 2.2 注释 2.3 输入验证 2.4 计算平均值 2.5 总结 3 基于高斯模型的贝叶斯分类器 3.1 函…

【搭建 Hbase 集群】

搭建 Hbase 集群 一、准备工作二、三台服务器之间的 SSH 免密登录1.修改hosts文件添加DNS映射2.在每台服务器上生成 SSH 密钥对3.将公共密钥&#xff08;通常为 ~/.ssh/id_rsa.pub&#xff09;复制到目标服务器上4.从本地使用 SSH 命令无需密码连接到目标服务器 二、安装JDK1.执…

Linux/Docker 修改系统时区

目录 1. Linux 系统1.1 通过 timedatectl 命令操作1.2 直接修改 /etc/localtime 文件 2. Docker 容器中的 Linux 操作环境&#xff1a; CentOS / AlmaOSMySQL Docker 镜像 1. Linux 系统 1.1 通过 timedatectl 命令操作 使用 timedatectl list-timezones 命令列出可用的时区…

Learning from Unlabeled 3D Environments forVision-and-Language Navigation

这篇论文是关于高级指令的 摘要 在视觉和语言导航 (VLN) 中&#xff0c;实体代理需要按照自然语言指令在真实的 3D 环境中进行导航。现有 VLN 方法的一个主要瓶颈是缺乏足够的训练数据&#xff0c;导致对未见过的环境的泛化效果不理想。虽然 VLN 数据通常是手动收集的&#x…