SUPER 4PCS配准

一、下载编译

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 中。

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

结果:

配准前

配准后,十分出色

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python笔记_程序流程控制

A&#xff0c;顺序控制 程序从上到下逐行执行 python定义变量时&#xff0c;会合法地向前引用 age 1 age2 age 1 age2 age 1 age 1 ——>错误&#xff0c;age应在age2之前 B&#xff0c;分支控制 1&#xff0c;单分支if 语法 if 条件表达式 &#xff1a; 代码块 说明…

matplotlib条形图

matplotlib条形图 假设你获取到了2017年内地电影票房前20的电影(列表a)和电影票房数据(列表b), 那么如何更加直观的展示该数据? from matplotlib import pyplot as plta ["Wolf Warrior 2", "Fast and Furious 8", "Kung Fu Yoga", "Jo…

【Godot4自学手册】第十九节敌人的血量显示及掉血特效

这一节&#xff0c;我主要学习敌人的血量显示、掉血显示和死亡效果。敌人的血量显示和主人公的血量显示有所不同&#xff0c;主要是在敌人头顶有个红色的血条&#xff0c;受到攻击敌人的血条会减少&#xff0c;并且有掉血数量的文字显示&#xff0c;效果如下&#xff1a; 一、…

写时复制简介

写时复制技术(Copy on Write)是比较常用的一种技术&#xff0c;它的主要目的是延迟减少以及延迟内存的分配&#xff0c;增加执行效率&#xff0c;只有在真正进行写操作的过程中才会真正分配物理资源。同时&#xff0c;也可以保护数据在系统崩溃时出现的丢失。比如&#xff0c;我…

2.2 mul、div、and、or乘除指令及所有寄存器英文名

汇编语言 1. mul乘指令 两个相乘的数&#xff0c;要么都是8位&#xff0c;要么都是16位 两个8位数相乘 一个默认放在al中&#xff0c;另一个放在8位reg或内存字节单元中8位乘法&#xff0c;结果默认放在ax中例如&#xff1a;计算100*10 100和10小于255&#xff0c;可以做8位…

勇敢尝鲜之Springboot3大坑-集成Mybatisplus报错:ddlApplicationRunner

&#x1f339;作者主页&#xff1a;青花锁 &#x1f339;简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java微服务架构公号作者&#x1f604; &#x1f339;简历模板、学习资料、面试题库、技术互助 &#x1f339;文末获取联系方式 &#x1f4dd; 往期热门专栏回顾 专栏…

AcWing 4726. 寻找数字

解题思路 在这个二插搜索树中寻找&#xff0c;4和7数量相等&#xff0c;并且大于n的最小数。 相关代码 import java.util.*;public class Main {static String s;static List<Integer> res new ArrayList<>();static long n;static long ansLong.MAX_VALUE;publ…

萌新学习RSA第二天(离线分解整数N)

1.yafu的使用&#xff08;离线环境分解N&#xff09;、 下载 打开 及使用 下载地址&#xff1a;https://sourceforge.net/projects/yafu/ 在下载好的并解压好的文件夹上鼠标右键打开终端 然后输入.\yafu-x64.exe并回车运行 .\yafu-x64.exe 来到这个页面就OK了 然后输入 fa…

如何使用ArcGIS Pro创建最低成本路径

虽然两点之间直线最短&#xff0c;但是在实际运用中&#xff0c;还需要考虑地形、植被和土地利用类型等多种因素&#xff0c;需要加权计算最低成本路径&#xff0c;这里为大家介绍一下计算方法&#xff0c;希望能对你有所帮助。 数据来源 教程所使用的数据是从水经微图中下载…

Outlook邮箱IMAP密码怎么填写?账户设置?

Outlook邮箱IMAP密码是什么&#xff1f;Outlook如何设置IMAP&#xff1f; 许多用户会选择通过IMAP协议将邮箱与各种邮件客户端进行连接。而在设置过程中&#xff0c;填写IMAP密码是必不可少的一步。那么&#xff0c;Outlook邮箱的IMAP密码应该如何填写呢&#xff1f;接下来&am…

一定用得到数据预处理:去噪、滤波方法!限幅滤波、中值滤波、均值滤波、递推平均滤波,直接运行!

​适用平台&#xff1a;Matlab2020版本及以上 在实际应用中&#xff0c;滤波、去噪都是用于信号处理的工具&#xff0c;通常用于机器学习/深度学习技术前的数据预处理阶段&#xff0c;主要作用在于对信号进行平滑处理或者去除噪声&#xff0c;从而提取出信号中的有用信息或者改…

win8.1 关闭资源管理器上的classic shell的工具条

打开控制面板&#xff0c;鼠标移动到菜单栏右键&#xff0c;去掉Classic Explorer Bar的勾选&#xff0c;重新打开资源管理器发现已经没有classic shell的工具条。 classic shell工具条占用屏幕空间&#xff0c;有没有什么用处 参考连接 It seems I cant disable the toolbar…

Apache POI的简单介绍与应用

介绍 Apache POI 是一个处理Miscrosoft Office各种文件格式的开源项目。我们可以使用 POI 在 Java 程序中对Miscrosoft Office各种文件进行读写操作。PS&#xff1a; 一般情况下&#xff0c;POI 都是用于操作 Excel 文件&#xff0c;如图&#xff1a; Apache POI 的应用场景&…

源码视角,vue3为什么推荐用ref,而不是reactive

ref 和 reactive 是 Vue3 中实现响应式数据的核心 API。ref 用于包装基本数据类型&#xff0c;而 reactive 用于处理对象和数组。尽管 reactive 似乎更适合处理对象&#xff0c;但 Vue3 官方文档更推荐使用 ref。 我的想法&#xff0c;ref就是比reactive好用&#xff0c;官方也…

C++进阶-- map和set

关联式容器 在前面&#xff0c;我们所学的vector、list、deque&#xff0c;这些都是序列容器&#xff0c;也就是底层为线性序列的数据结构。 而关联式容器是C标准库中的一种类别&#xff0c;用于存储键值对&#xff08;key-value pair&#xff09;&#xff0c;关联式容器中的元…

ASUS华硕天选5笔记本电脑FX607JV原装出厂Win11系统下载

ASUS TUF Gaming F16 FX607JV天选五原厂Windows11系统 适用型号&#xff1a; FX607JU、FX607JI、FX607JV、 FX607JIR、FX607JVR、FX607JUR 下载链接&#xff1a;https://pan.baidu.com/s/1l963wqxT0q1Idr98ACzynQ?pwd0d46 提取码&#xff1a;0d46 原厂系统自带所有驱动、…

3.3日学习打卡----初学Redis(一)

3.3日学习打卡 目录&#xff1a; 3.3日学习打卡NoSQL为什么要用NoSQL什么是NoSQL?NoSQL的四大分类关系型数据库和非关系型数据及其区别NoSQL经典应用 RedisRedis是什么?Linux下安装RedisDocker下安装Redis基本知识 NoSQL 为什么要用NoSQL 单机Mysql的美好年代 在90年代&…

00X集——vba获取CAD图中图元类名objectname

在CAD中&#xff0c;通过快捷键PL&#xff08;即POLYLINE命令&#xff09;绘制的线属于AcDbPolyline。AcDbPolyline也被称为LWPOLYLINE&#xff0c;即简单Polyline&#xff0c;它所包含的对象在本身内部。 此外&#xff0c;CAD中还有另一种二维多段线对象&#xff0c;称为AcDb2…

(3)(3.1) FlightDeck FrSky发射器应用程序

文章目录 前言 1 概述 2 Turnkey Packages 3 参数说明 前言 ​Craft and Theory 的 FlightDeck 可让你轻松查看飞行模式、高度、速度、姿态和关键系统警报&#xff0c;包括故障保护和电池错误&#xff0c;如电池不平衡警告和发射机低电量警报。 1 概述 Craft and Theory 的…

防抖和节流的实现

《防抖和节流》 防抖1. 概念介绍2. 函数实现3. 应用场景 节流1. 概念介绍2. 函数实现3. 应用场景 防抖 1. 概念介绍 在没有使用防抖函数之前&#xff1a;当我们需要搜索某些物体信息时会导致浏览器压力很大&#xff0c;性能很低。"防抖函数"的作用就是等到用户停止…