一、下载编译
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);
-
pcl::Super4PCS<pcl::PointXYZ, pcl::PointXYZ> sfpcs;
:创建了一个 Super4PCS 对象,用于点云的配准。 -
sfpcs.setInputSource(cloud_source);
:设置输入源点云,cloud_source
可能是一个pcl::PointCloud<pcl::PointXYZ>
类型的点云数据。 -
sfpcs.setInputTarget(cloud_target);
:设置目标点云,cloud_target
也是一个pcl::PointCloud<pcl::PointXYZ>
类型的点云数据。 -
sfpcs.setOverlap(0.99);
:设置匹配的重叠率。这个值介于 0 到 1 之间,表示匹配过程中两个点云之间的重叠程度。设置为 0.99 表示非常高的重叠率,这可能会导致更准确的匹配结果,但也可能增加计算时间。 -
sfpcs.setDelta(0.005);
:设置增量。增量控制算法在搜索空间中的步长或精度。较小的增量可能导致更精确的结果,但也可能导致更长的计算时间。 -
sfpcs.setMaxTimeSeconds(10000);
:设置最大计算时间,单位是秒。这个参数控制了算法的最大运行时间,避免了算法长时间运行而无法终止。 -
sfpcs.setMaxCorrespondenceDistance(0.5);
:设置最大对应距离。这个值表示两个点云中的点之间允许的最大距离,超过这个距离的点将不会被考虑在内。较大的值可能允许更大的误差,但也可能导致错误的匹配。 -
sfpcs.align(*cloud_source);
:调用 Super4PCS 算法的align()
函数,将输入源点云与目标点云进行配准。配准的结果将会存储在输入源点云cloud_source
中。
这些参数的设置会影响配准结果的准确性、计算时间以及内存消耗。需要根据具体的应用需求和点云数据特点来调整这些参数以获得最佳的配准效果。
结果:
配准前
配准后,十分出色