PCL 点云匹配 之NICP(Normal ICP)

一、概述

 上面一篇中我们已经得出了一个结论,就是ICP虽然简单,但是也有明显的缺点

1、计算速度慢,收敛慢,迭代次数多

2、对内存的开销比较大

3、很容易陷入局部最优的困局

因此我们在经典ICP的基础上添加一两个约束:

第一个约束就是添加法向量,计算当前点R半斤内的法向量,算法向量的夹角

第二个约束就是添加曲率,添加曲率

这样我们就可以减少迭代的次数,加速收敛。

二、计算点云的法向量和曲率

原理:

 找到当前点pi的r 半斤类的所有的点V,然后计算出当前点集V的均值ui,然后开始计算V到的协方差

 由于协方差的对称性,我们可以对这个矩阵进行SVD矩阵分解

曲率:

\lambda 1 \lambda2 \lambda3 是按照从小到大的顺序排列的,那么曲率可以计算:

\sigma =\frac{\lambda 1}{\lambda 1+\lambda 2+\lambda 3}

 \lambda 1<=\lambda 2<=\lambda 3 ,并且 \lambda越小表示当前点云半斤内越平坦

最小的特征值对应的就是法向量的方向。

数学技巧篇69:特征值、特征向量的求法与证明 - 知乎

法向量

求解最小特征值的特征向量即为法向量

法向量的定向

从上面我们可以计算出法向量,那么法向量如何定向呢,也就是说一条直线你规定那个方向为正方向呢???

可以用视点Vp *Ni(当前点的法向量) >0 为正 等

PCL中的法向量定向

已知视点Vp ,对于任意的半径内的点坐标Pi 以及其对应的法向量ni,其定向如下:

                                                             n_{i} *(V_{_{p}}-P{_{i}})

flipNormalTowardsViewpoint (const PointT &point, float vp_x, float vp_y, float vp_z, Eigen::Vector4f &normal);

法向量方向测试

 比较如下

code

#include <pcl/io/pcd_io.h>
#include <pcl/kdtree/kdtree_flann.h>
//#include <pcl/features/normal_3d.h>
#include <pcl/features/normal_3d_omp.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <boost/thread/thread.hpp>
#include "vtkAutoInit.h"
VTK_MODULE_INIT(vtkRenderingOpenGL);
VTK_MODULE_INIT(vtkInteractionStyle);
VTK_MODULE_INIT(vtkRenderingFreeType)




#if 1

int main()
{
		//------------------加载点云数据-------------------

	  //C:\Users\Albert\Desktop\halcon_to_pcl\normal\normaltest2.pcd
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
	if (pcl::io::loadPCDFile<pcl::PointXYZ>("C:\\Users\\Albert\\Desktop\\halcon_to_pcl\\classfiy\\0.pcd", *cloud) == -1)
	{

		// 找不到点云文件
		return  -1;
	}

	//------------------计算法线----------------------
	pcl::NormalEstimationOMP<pcl::PointXYZ, pcl::Normal> n;//OMP加速
	pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal>);
	//建立kdtree来进行近邻点集搜索
	pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>());
	n.setNumberOfThreads(10);//设置openMP的线程数 我一般是10条就够了


  // 主要是改变这个值来看看点云的法向量的方向变换
	n.setViewPoint(1,1,1);//设置视点,默认为(0,0,0)





	n.setInputCloud(cloud);
	n.setSearchMethod(tree);
	n.setKSearch(10);//点云法向计算时,需要所搜的近邻点大小
	//n.setRadiusSearch(0.03);//半径搜素
	n.compute(*normals);//开始进行法向计

	//----------------可视化--------------
	boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("Normal viewer"));
	//viewer->initCameraParameters();//设置照相机参数,使用户从默认的角度和方向观察点云
	//设置背景颜色
	viewer->setBackgroundColor(0.3, 0.3, 0.3);
	viewer->addText("Normal", 10, 10, "text");
	//设置点云颜色
	pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> single_color(cloud, 255, 225,255);
	//添加坐标系
	viewer->addCoordinateSystem(0.1);
	viewer->addPointCloud<pcl::PointXYZ>(cloud, single_color, "sample cloud");


	//添加需要显示的点云法向。cloud为原始点云模型,normal为法向信息,10表示需要显示法向的点云间隔,即每10个点显示一次法向,0.1表示法向长度。
	viewer->addPointCloudNormals<pcl::PointXYZ, pcl::Normal>(cloud, normals, 100, 0.03, "normals");



	//设置点云大小
	viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "sample cloud");
	while (!viewer->wasStopped())
	{
		viewer->spinOnce(100);
		boost::this_thread::sleep(boost::posix_time::microseconds(100000));
	}

	return 0;

}

#endif 

四、算法原理

五、算法流程

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

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

相关文章

鸿蒙开发之简单登录页面

Entry Component struct Index {State loading:booleanfalse;build() {Row() {Column({ space: 5 }) {Image($r("app.media.app_icon")).width(100).height(100).borderRadius(10).margin({top: 60})Text("登录界面").fontSize(40).fontWeight(FontWeight.…

Apollo Planning——PathLaneBorrowDecider

引用 组件数据缓存 DependencyInjector DependencyInjector&#xff1a;依赖注入器&#xff0c;这是一个过于专业的名词&#xff0c;来自软件设计模式的依赖倒置原则的一种具体实现方式&#xff0c;起到模块解耦作用。“依赖倒置原则(Dependence Inversion Principle)是程序要…

全国国控监测点点位数据,shp/excel格式,已可视化

基本信息. 数据名称: 全国国控监测点点位数据 数据格式: shpexcel 时间版本&#xff1a;2023年 数据几何类型: 点 数据精度&#xff1a;全国 数据坐标系: WGS84 数据来源&#xff1a;网络公开数据 数据字段&#xff1a; 序号字段名称字段说明1province省名称2city城市…

设计模式 原型模式 与 Spring 原型模式源码解析(包含Bean的创建过程)

原型模式 原型模式(Prototype模式)是指&#xff1a;用原型实例指定创建对象的种类&#xff0c;并且通过拷贝这些原型&#xff0c;创建新的对象。 原型模式是一种创建型设计模式&#xff0c;允许一个对象再创建另外一个可定制的对象&#xff0c;无需知道如何创建的细节。 工作原…

SQLturning:定位连续值范围起点和终点

在上一篇blog说到&#xff0c;如何去优化查询连续值范围&#xff0c;没看过的朋友&#xff0c;上篇blog链接[在此]。(https://blog.csdn.net/weixin_42575078/article/details/135067645?spm1001.2014.3001.5501) 那么今天来说说怎么将连续的数据合并&#xff0c;然后返回合并…

Android的组件、布局学习

介绍 公司组织架构调整&#xff0c;项目组需要承接其他项目组的android项目&#xff0c;负责维护和开发新需求&#xff0c;故学习下基础语法和项目开发。 组件学习 Toolbarheader布局部分 就是app最顶部的部分 他的显示与否&#xff0c;是与F:\androidProject\android_lear…

HTML有哪些列表以及具体的使用!!!

文章目录 一、HTML列表二、列表的应用1、无序列表2、有序列表3、自定义列表 三、总结 一、HTML列表 html的列表有三种&#xff0c;一种是无序列表&#xff0c;一种是有序列表&#xff0c;还有一种为自定义列表。 二、列表的应用 1、无序列表 <ul> <li>无序列表…

【ONE·English || 翻译作业 Development: Mendel‘s Legacy to Genetics】

总言 作业&#xff1a;没有严格按照语句结构进行翻译&#xff0c;有不规范之处。下述目录中每一小节是按照原文段落划分。   相关链接&#xff1a;pubmed中查阅的链接&#xff0c;提供了两处文章平台。 文章目录 总言part11.11.21.3 part2&#xff1a;Entwicklung and develo…

LabVIEW开发自动驾驶的双目测距系统

LabVIEW开发自动驾驶的双目测距系统 随着车辆驾驶技术的不断发展&#xff0c;自动驾驶技术正日益成为现实。从L2级别的辅助驾驶技术到L3级别的受条件约束的自动驾驶技术&#xff0c;车辆安全性和智能化水平正在不断提升。在这个过程中&#xff0c;车辆主动安全预警系统发挥着关…

hive企业级调优策略之Join优化

测试所用到的数据参考&#xff1a; 原文链接&#xff1a;https://blog.csdn.net/m0_52606060/article/details/135080511 本教程的计算环境为Hive on MR。计算资源的调整主要包括Yarn和MR。 Join算法概述 Hive拥有多种join算法&#xff0c;包括Common Join&#xff0c;Map …

Android 应用基准分析

先推荐一个作者的开源项目 最快的Json解析方式 参考 benchmark数据参考 benchmark的例子 可以参考json-benchmark 应用基准分析 是衡量时间维度的框架,是App界的鲁大师跑分,常用于耗时判断,冷启动,热启动,框架对比 预热对比等方面 开局一张图 下面再编 今天要做的是Microbe…

使用Python编写简单网络爬虫实例:爬取图片

&#x1f34e;个人主页 &#x1f3c6;个人专栏&#xff1a;日常聊聊 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 ​编辑 简介 步骤 1. 安装依赖库 2. 创建目录 3. 发送HTTP请求并解析页面 4. 查找图片标签并下载图片 注意事项 结语 我的其他博客 简介 网络爬虫是一种…

我的游戏被DDoS攻击了怎么办?

“我的游戏最近一直在被攻击&#xff0c;有什么办法可以解决”&#xff0c;最近遇到不少用户来问德迅云安全提到了自己目前遇到的这个攻击问题&#xff0c;询问有没有什么好的解决办法&#xff1f; 那遇到用户反馈的DDOS攻击&#xff0c;德迅云安全是怎么做的。 很多用户现在遇…

js数组方法总结,数组遍历方法,判断数组方法总结

目录 原生数组方法数组方法用法说明数组乱序和数组拆解会改变数组的方法不改变数组的方法JS 中的数组存储 判断数组的方法数组遍历的方法forEach和map方法有什么区别 原生数组方法 1.数组和字符串转换方法&#xff1a;toString&#xff0c;toLocalString&#xff0c;join&…

如何使用Qu1ckdr0p2快速通过HTTP或HTTPS实现文件托管

关于Qu1ckdr0p2 Qu1ckdr0p2是一款功能强大的文件托管工具&#xff0c;在该工具的帮助下&#xff0c;广大研究人员可以快速通过HTTP或HTTPS托管包括Payload和后渗透代码在内的任何文件。 Qu1ckdr0p2提供了别名和搜索功能&#xff0c;相关功能模块位于qu1ckdr0p2-tools库中。默…

半导体管路连接PFA阀门的应用说明

PFA阀门在半导体行业中具有广泛的应用。以下是PFA阀门在半导体行业中的几个应用领域&#xff1a; 1. 超纯水系统&#xff1a;在半导体行业中&#xff0c;超纯水是一个至关重要的介质&#xff0c;用于洗涤和清洁半导体芯片及其他关键器件。PFA阀门由于其优异的耐腐蚀性和高纯度特…

Java设计模式之七大设计原则

七大设计原则 设计原则概述 单一职责原则 定义 一个类仅有一个引起它变化的原因 分析 模拟场景 访客用户 普通用户 VIP用户 代码实现 /*** 视频用户接口*/ public interface IVideoUserService {void definition();void advertisement(); }/*** 访客用户*/ public class…

【容器Docker】Docker学习笔记

1、什么是Docker&#xff1a; Docker 将程序和程序运行所依赖的所有环境都打包到镜像里。“build once, run anywhere”Docker 是容器的一种实现。 Windows 下如何安装Docker: 官方安装教程&#xff1a;Install Docker Desktop on Windows | Docker Docs有两种安装套装&…

【基础篇】YOLO系列之训练环境(GPU)搭建篇

&#x1f680;Pytorch环境配置&#xff08;Windows&#xff09; &#x1f528; Anaconda安装 此处下载安装即可 ⭐温馨提示&#xff1a;安装路径不能含有中文&#xff0c;建议不要安在c盘&#xff08;很占内存&#xff09; 环境变量配置 编辑系统环境变量 -> 环境变量 ->…

短视频账号矩阵系统源码3年技术服务部署

安装Web服务器&#xff1a;搭建系统需要一个Web服务器&#xff0c;例如Apache或Nginx。 安装PHP环境&#xff1a;PHP是一种服务器端脚本语言&#xff0c;用于处理Web应用程序中的动态内容。你需要安装和配置PHP环境。 一、安装MySQL数据库&#xff1a;抖音短视频SEO矩阵系统需…