当前位置: 首页 > news >正文

open3d点云配准函数registration_icp

文章目录

    • 基本原理
    • open3d调用
    • 绘图

基本原理

ICP, 即Iterative Closest Point, 迭代点算法。

ICP算法有多种形式,其中最简单的思路就是比较点与点之间的距离,对于点云P={pi},Q={qi}P=\{p_i\}, Q=\{q_i\}P={pi},Q={qi}而言,如果二者是同一目标,通过旋转、平移等操作可以实现重合的话,那么只需要固定QQQ而不断地旋转或平移PPP,最终二者一定能最完美地重合。

设旋转PPP的矩阵为RRR,平移矩阵为ttt,在完美匹配的情况下,必有qi=Rpi+tq_i = Rp_i + tqi=Rpi+t

又因三维点云不具备栅格特征,故而很难保证qiq_iqipip_ipi是同一点,所以要使得目标函数最小化

arg min⁡R,t12∑i=1n∥qi−Rpi−t∥2\argmin_{R,t}\frac{1}{2}\sum^n_{i=1}\Vert q_i-Rp_i-t\Vert^2 R,targmin21i=1nqiRpit2

1992年Chen和Medioni对此方案进行了改进,提出了点对面的预估方法,其目标函数为

arg min⁡R,t12∑i=1n[(qi−Rpi)⋅np]2\argmin_{R,t}\frac{1}{2}\sum^n_{i=1}[(q_i-Rp_i)\cdot n_p]^2 R,targmin21i=1n[(qiRpi)np]2

其中npn_pnp是点ppp的法线,这种方案显然效率更高。

open3d调用

open3d中实现了ICP算法,参数如下

registration_icp(source, target, max_correspondence_distance, init, estimation_method, criteria)

source为点云PPPtarget为目标点云QQQmax_correspondence_distance为匹配点在未匹配时的最大距离,init为初始变化矩阵,默认为单位矩阵;criteria为精度。

estimation_method可以理解为上面提到的两种方案,下面选择点对点ICP方法进行计算

import numpy as np
import open3d as o3dpipreg = o3d.pipelines.registrationpcd = o3d.data.DemoICPPointClouds()
src = o3d.io.read_point_cloud(pcd.paths[0])
tar = o3d.io.read_point_cloud(pcd.paths[1])
th = 0.02
trans_init = np.array([[0.862, 0.011, -0.507, 0.5], [-0.139, 0.967, -0.215, 0.7],[0.487, 0.255, 0.835, -1.4], [0.0, 0.0, 0.0, 1.0]])reg = pipreg.registration_icp(src, tar, th, trans_init,pipreg.TransformationEstimationPointToPoint())print(reg.transformation)
''' 变换矩阵
[[ 0.83924644  0.01006041 -0.54390867  0.64639961][-0.15102344  0.96521988 -0.21491604  0.75166079][ 0.52191123  0.2616952   0.81146378 -1.50303533][ 0.          0.          0.          1.        ]]
'''
print(reg)

print(reg)的返回信息如下,表示点云配准的拟合程度

RegistrationResult with fitness=3.724495e-01, inlier_rmse=7.760179e-03, and correspondence_set size of 74056 Access transformation to get result.

绘图

为了对比配准前后的区别,对srctar放在图中对比

import copy
srcDraw = copy.deepcopy(src)
tarDraw = copy.deepcopy(tar)
srcDraw.paint_uniform_color([1, 1, 0])
tarDraw.paint_uniform_color([0, 1, 1])
srcDraw.transform(tf)
o3d.visualization.draw_geometries([srcDraw, tarDraw])

此为原图,可以看到两组点云完全是错位的

在这里插入图片描述

srcDraw = copy.deepcopy(src)
tarDraw.paint_uniform_color([0, 1, 1])
srcDraw.transform(reg.transformation)
o3d.visualization.draw_geometries([srcDraw, tarDraw])

得到结果如下,可见两组不同颜色的点云已经几乎重合到了一起

在这里插入图片描述

http://www.lryc.cn/news/6100.html

相关文章:

  • HTML编码规范
  • PDF SDK for Linux 8.4.2 Crack
  • vb 模块和作用域的关系
  • Redis分布式锁
  • 京东前端经典面试题整理
  • django+mysql实现一个简单的web登录页面
  • python cartopy手动导入地图数据绘制底图/python地图上绘制散点图:Downloading:warnings/散点图添加图里标签
  • JavaScript中常用的数组方法
  • 磁疗为什么“没效果”?原来真相是这样!
  • 【直击招聘C++】5.1函数模板
  • 谈谈Java多线程离不开的AQS
  • 国际化语言,多语言三种方式
  • C++——哈希3|位图
  • 75 error
  • ESP-C3入门8. 连接WiFi并打印信息
  • 使用python将EXCEL表格中数据转存到数据库
  • 【C++】类和对象(三)
  • vTESTstudio - VT System CAPL Functions - General/Trigger Function
  • IDEA 快捷键
  • 2023新华为OD机试题 - 入栈出栈(JavaScript) | 刷完必过
  • 微信公众号扫码授权登录思路
  • 数据结构与算法基础-学习-10-线性表之顺序栈的清理、销毁、压栈、弹栈
  • Hazel游戏引擎(005)
  • 牛客网Python篇数据分析习题(四)
  • 盲盒如何创业?
  • 第1集丨Java中面向对象相关概念汇总
  • 高性能(二)
  • Allegro如何实现同一个屏幕界面分屏显示操作指导
  • 前后端一些下载与配置(第二篇 第10天过后)nuxt banner redis 短信服务
  • OSG三维渲染引擎编程学习之四十八:“第五章:OSG场景渲染” 之 “5.6 多重纹理映射”