SUPER 4PCS配准

2024-03-03 21:20
文章标签 super 配准 4pcs

本文主要是介绍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 中。

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

结果:

配准前

配准后,十分出色

这篇关于SUPER 4PCS配准的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/770944

相关文章

问:Super与this在Java中有什么区别?

this: this 关键字用于引用当前对象。它通常用于区分成员变量和方法参数或局部变量。在实例方法中,this 指向调用该方法的对象。在构造函数中,this 指向正在被初始化的对象。 super: super 关键字用于引用父类(超类)的构造函数、方法或变量。在子类的构造函数中,super() 用于调用父类的构造函数。在子类的方法中,super.methodName() 用于调用父类的方法。

Unity 资源 之 Super Confetti FX:点亮项目的璀璨粒子之光

Unity 资源 之 Super Confetti FX:点亮项目的璀璨粒子之光 一,前言二,资源包内容三,免费获取资源包 一,前言 在创意的世界里,每一个细节都能决定一个项目的独特魅力。今天,要向大家介绍一款令人惊艳的粒子效果包 ——Super Confetti FX。 二,资源包内容 💥充满活力与动态,是 Super Confetti FX 最显著的标签。它宛如一位

MTK Android P/Q system/vendor/super快速打包

一、Android 新版本默认开启了动态分区,把system vendor  product等分区打包成一个super分区。这对于我们使用替换分区的方法来排查问题不是很方便,直接替换一个super也不知道到底是哪个部分导致的。所以我们需要自己制作super.img来缩小范围。下面讲讲如何快速生成system、vendor、super,以及vbmeta(校验image,不匹配可能会导致不开机) 二

? extends T 和 ? super T分别是什么意思?有什么不同?

<? extends T>首先你很容易误解它为继承于T的所有类的集合,这是大错特错的,相信能看下去你一定见过或用过List<? extends T>吧?为什么我说理解成一个集合是错呢?如果理解成一个集合那为什么不用List<T>来表示?所以<? extends T>不是一个集合,而是T的某一种子类的意思,记住是一种,单一的一种,问题来了,由于连哪一种都不确定,带来了不确定性,所以是不可能通过add

三维激光扫描点云配准外业棋盘的布设与棋盘坐标测量

文章目录 一、棋盘标定板准备二、棋盘标定板布设三、棋盘标定板坐标测量 一、棋盘标定板准备 三维激光扫描棋盘是用来校准和校正激光扫描仪的重要工具,主要用于提高扫描精度。棋盘标定板通常具有以下特点: 高对比度图案:通常是黑白相间的棋盘格,便于识别。已知尺寸:每个格子的尺寸是已知的,可以用于计算比例和调整。平面标定:帮助校准相机和激光扫描仪之间的位置关系。 使用方法 扫描棋盘:

java基础总结11-面向对象7(super关键字)

在JAVA类中使用super来引用父类的成分,用this来引用当前对象,如果一个类从另外一个类继承,我们new这个子类的实例对象的时候,这个子类对象里面会有一个父类对象。怎么去引用里面的父类对象呢?使用super来引用,this指的是当前对象的引用,super是当前对象里面的父对象的引用。 1 super关键字测试 package cn.galc.test;/*** 父类* @autho

【大数据Java基础-JAVA 面向对象14】面向对象的特征二:继承性 (三) 关键字:super以及子类对象实例化全过程

关键字:super 1.super 关键字可以理解为:父类的 2.可以用来调用的结构: 属性、方法、构造器 3.super调用属性、方法: 3.1 我们可以在子类的方法或构造器中。通过使用"super.属性"或"super.方法"的方式,显式的调用父类中声明的属性或方法。但是,通常情况下,我们习惯省略"super." 3.2 特殊情况:当子类和父类中定义了同名的属性时,我们要想在子类中调用父类

【BNU】33943 Super Rooks on Chessboard 【FFT】

【BNU】33943 Super Rooks on Chessboard UVA上的题,然而我怎么会蠢到去UVA呢!(其实是百度首先跳出来的是BNU → \to_ → \to) 题目分析: 设 numx numx为 N N个车没有覆盖的行数,numynumy为 N N个车没有覆盖的列数。 首先我们考虑没有主对角线覆盖这一条件时,总共的没有被覆盖的面积就是numx∗numynumx \ast

Super Pow

Your task is to calculate ab mod 1337 where a is a positive integer and b is an extremely large positive integer given in the form of an array. Example1: a = 2b = [3]Result: 8 Example2: a = 2

JAVA中this和super关键字

1.什么是super?什么是this ? super关键字表示超(父)类的意思。this变量代表对象本身。 2.使用super&this 调用成员变量和方法 可以使用super访问父类被子类隐藏的变量或覆盖的方法。当前类如果是从超类继承而来的,当调用super.XX()就是调用基类版本的XX()方法。见示例1。 当类中有两个同名变量,一个属于类(类的成员变量),而