点云配准——(2)四点法

2023-11-21 19:20
文章标签 点云 配准 四点

本文主要是介绍点云配准——(2)四点法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

点云配准的方法

基于局部特征配准:PFH、FPFH、3Dsc

基于全局特征配准:4pcs、super4pcs、kfpcs

基于概率配准:NDT

今天实现一下四点法配准

四点法配准原理:根据原始点云中不共面四点的仿射不变性,从目标点云中寻找,从而获得变换矩阵。

代码实现如下:

 

 

#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/io/obj_io.h>
#include <pcl/features/normal_3d.h>//法线
#include <pcl/surface/gp3.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <boost/math/special_functions/round.hpp>
#include <iostream>
#include <pcl/registration/ia_fpcs.h>
#include <pcl/registration/ia_kfpcs.h>
#include <time.h>using namespace std;
typedef pcl::PointXYZ PointT;
typedef pcl::PointCloud<PointT> PointCloud;void visualize_pcd(PointCloud::Ptr pcd_src, PointCloud::Ptr pcd_tgt, PointCloud::Ptr pcd_final)
{pcl::visualization::PCLVisualizer viewer("registration Viewer");//原始点云绿色pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> src_h(pcd_src, 0, 255, 0);//目标点云红色pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> tgt_h(pcd_tgt, 255, 0, 0);//匹配好的点云蓝色pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> final_h(pcd_final, 0, 0, 255);viewer.setBackgroundColor(255, 255, 255);viewer.addPointCloud(pcd_src, src_h, "source cloud");viewer.addPointCloud(pcd_tgt, tgt_h, "target cloud");viewer.addPointCloud(pcd_final, final_h, "result 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);pcl::io::loadOBJFile("E:/vc14/data/hippo1.obj", *cloud_source);pcl::io::loadOBJFile("E:/vc14/data/hippo2.obj", *cloud_target);clock_t start = clock();//四点法配准PointCloud::Ptr pcs(new PointCloud);pcl::registration::FPCSInitialAlignment<pcl::PointXYZ,pcl::PointXYZ> fpcs;fpcs.setInputSource(cloud_source);fpcs.setInputTarget(cloud_target);//参数设置fpcs.setApproxOverlap(0.7);fpcs.setDelta(0.01);fpcs.setMaxComputationTime(1000);fpcs.setNumberOfSamples(200);fpcs.align(*pcs);clock_t end = clock();cout << "时间为: " << (double)(end - start) / (double)CLOCKS_PER_SEC<<endl;Eigen::Matrix4f tras = fpcs.getFinalTransformation();cout << "变换矩阵" << tras << endl;PointCloud::Ptr cloud_end(new PointCloud);pcl::transformPointCloud(*cloud_source,*cloud_end,tras);//pcl::io::loadOBJFile("E:/vc14/choose_bat/supre4pcs/super4pcs_fast.obj", *cloud_end);visualize_pcd(cloud_source, cloud_target, cloud_end);return (0);}

结果如下:

 

 

 

 

在对上述结果进行icp精配准

结果如下:

 

可以看出,变换后的点云与目标点云更切合,变换矩阵也更精确。

其他全局配准方法也同理,比如kfpcs配准。

完整的配准代码如下会稍后上传。

 

 

 

这篇关于点云配准——(2)四点法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

2、PF-Net点云补全

2、PF-Net 点云补全 PF-Net论文链接:PF-Net PF-Net (Point Fractal Network for 3D Point Cloud Completion)是一种专门为三维点云补全设计的深度学习模型。点云补全实际上和图片补全是一个逻辑,都是采用GAN模型的思想来进行补全,在图片补全中,将部分像素点删除并且标记,然后卷积特征提取预测、判别器判别,来训练模型,生成的像

【LVI-SAM】激光雷达点云处理特征提取LIO-SAM 之FeatureExtraction实现细节

激光雷达点云处理特征提取LIO-SAM 之FeatureExtraction实现细节 1. 特征提取实现过程总结1.0 特征提取过程小结1.1 类 `FeatureExtraction` 的整体结构与作用1.2 详细特征提取的过程1. 平滑度计算(`calculateSmoothness()`)2. 标记遮挡点(`markOccludedPoints()`)3. 特征提取(`extractF

点云数据常见的坐标系有哪些,如何进行转换?

文章目录 一、点云坐标系分类1. 世界坐标系2. 相机坐标系3. 极坐标系4. 笛卡尔坐标系(直角坐标系):5. 传感器坐标系6. 地理坐标系 二、坐标系转换方法1. 地理坐标系与投影坐标系之间的转换2. 投影坐标系与局部坐标系之间的转换3. 局部坐标系与3D模型坐标系之间的转换4. 相机坐标系与其他坐标系之间的转换5. 传感器坐标系与其他坐标系之间的转换 三、坐标系转换工具 一

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

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

51NOD1265(四点共面)

题目链接:点击打开链接 解题思路:   判断四点共面,先求出三点构成的平面的法向量(叉积),如果第四个点和前三点任意一点构成的向量与平面法向量垂直(点积为0),则四点共面.    回忆下叉积和点积.对于三位空间向量,叉积公式为 =( ), =( ), a× b=( - ) i+( - ) j+(

基于opencv实现双目立体匹配点云距离

双目相机或两个单目相机。 一、相机标定 MATLAB软件,打开双目标定app。 点击add images,弹出加载图像的窗口,分别导入左图和右图,设置黑白格长度(标定板的长度一般为20)。 点击确定,弹出加载好的图像。 在菜单栏勾选2 Coefficients(鱼眼相机勾选3 Coefficients)、Tangential Distinction,点击Calibrate,显示

CUDAPCL ROR点云滤波

文章目录 一、简介二、实现代码三、实现效果参考资料 一、简介 该方法的具体原理为输入的点云中每一个点设定一个范围(半径为r的圆),如果在该范围内没有达到某一个设定的点数值,则该数据点将会被删除,重复上述此过程直到最后一个数据点,即完成该滤波过程。 二、实现代码 ROR.cuh #ifndef ROR_GPU_CUH#define ROR_GPU_CU

2d激光点云识别退化场景(长走廊)

注:算法只适用于静态场景,在有动态场景(行人)的环境下不适用 退化场景描述 场景一:长走廊 激光探测距离有限,在长走廊环境下,激光在某些位置无法探测到走廊尽头,会出现如上图情况,激光轮廓为红色的两条平行线。对于这种情况,我们只需寻找到只有两个平行线,即位退化场景 场景二:单一墙面 通常情况下,退化场景为如上两种情况,当然多条平行线也是符合的。 算法思路为,如果激光雷达点云构成的特征都是平行线

Open3D 点云添加均匀分布的随机噪声

目录 一、概述 1.1实现步骤 1.2应用场景 二、代码实现 三、实现效果 3.1原始点云 3.2添加噪声后点云 Open3D点云算法汇总及实战案例汇总的目录地址: Open3D点云算法与点云深度学习案例汇总(长期更新)-CSDN博客 一、概述         在 Open3D 中,可以通过向点云的每个点添加随机噪声来模拟实际的测量误差或环境噪声。均匀分布的随机噪声是

Pangolin多视口显示——按钮面板,图片,三维点云

这篇博客记录: Pangolin的几类显示方法,包括按钮面板,彩色图片,三维点云(可变换视角)Pangolin显示cv::Mat格式图片的方法原本倒置的图片自下而上渲染(变正:) 1.按钮面板 //新建按钮和选择框pangolin::CreatePanel("按钮面板").SetBounds(0.0,1.0,0.0,0.2);//第一个参数为按钮的名字,第二个为默认状态,第三个为是