本教程演示了一种同时使用几何形状和颜色进行配准的ICP变体。它实现了这篇文章的算法 [Park2017] ,实现了颜色信息将沿切线平面锁定对齐。这个算法与之前的ICP配准速度相当,但是实现了更高的精度和鲁棒性。本教程使用的符号来自ICP配准。

辅助可视化函数

为了演示彩色点云间配准的对齐,draw_registration_result_original_color使用原本的颜色可视化源点云。

# -*- coding: UTF-8 -*-
import copy
import numpy as np
import open3d as o3ddef draw_registration_result_original_color(source, target, transformation):source_temp = copy.deepcopy(source)source_temp.transform(transformation)o3d.visualization.draw_geometries([source_temp, target],zoom=0.5,front=[-0.2458, -0.8088, 0.5342],lookat=[1.7745, 2.2305, 0.9787],up=[0.3109, -0.5878, -0.7468])

输入

下面的代码从两个文件中读取源点云和目标点云。使用单位矩阵作为配准的初始化。

print("1. 加载两点云并可可视化它们间的位姿关系")
source = o3d.io.read_point_cloud("../../test_data/ColoredICP/frag_115.ply")
target = o3d.io.read_point_cloud("../../test_data/ColoredICP/frag_116.ply")# 可视化初始的配准
current_transformation = np.identity(4)
draw_registration_result_original_color(source, target, current_transformation)

点到面的ICP

我们首先运行 Point-to-plane ICP 作为一个基准算法.下面的可视化结果展示了未对齐的绿色三角形纹理.这是因为几何约束不能够防止两个平面的滑动.

# 点到面的ICP
current_transformation = np.identity(4)
print("2. 在原始点云上应用点到平面ICP配准来精准对齐,距离阈值0.02。")result_icp = o3d.pipelines.registration.registration_icp(source, target, 0.02, current_transformation,o3d.pipelines.registration.TransformationEstimationPointToPlane())
print(result_icp)
draw_registration_result_original_color(source, target, result_icp.transformation)

彩色点云配准

彩色点云配准的核心函数是 registration_colored_icp .在[Park2017]这篇论文中,它使用的是具有联合优化目标的ICP迭代(细节请看 Point-to-point ICP):


其中的是被估计旋转矩阵.分别是光度学和几何学术语.  ∈ [ 0 , 1 ] 是通过经验决定的权重变量.
这里的几何项 和 Point-to-plane ICP 的目标是相等的.

其中  是当前迭代的对应集,是对应点  的法线.
颜色项​ 测量的是  点的颜色(用 表示)与其在点的切平面的投影上的颜色之间的差.

其中的是在的切平面上连续定义的预计算函数. 函数将3D点投影到切平面.更多细节请参看 [Park2017].
为了进一步提高效率, [Park2017]提供了多尺度的配准方案,这已在以下脚本中实现:

# 彩色点云配准
# 在以下论文中实现
# J. Park, Q.-Y. Zhou, V. Koltun,
# Colored Point Cloud Registration Revisited, ICCV 2017
voxel_radius = [0.04, 0.02, 0.01]
max_iter = [50, 30, 14]
current_transformation = np.identity(4)
print("3. 彩色点云配准")
for scale in range(3):iter = max_iter[scale]radius = voxel_radius[scale]print([iter, radius, scale])print("3-1. 下采样的点云的体素大小: %.2f" % radius)source_down = source.voxel_down_sample(radius)target_down = target.voxel_down_sample(radius)print("3-2. 法向量估计.")source_down.estimate_normals(o3d.geometry.KDTreeSearchParamHybrid(radius=radius * 2, max_nn=30))target_down.estimate_normals(o3d.geometry.KDTreeSearchParamHybrid(radius=radius * 2, max_nn=30))print("3-3. 应用彩色点云配准")result_icp = o3d.pipelines.registration.registration_colored_icp(source_down, target_down, radius, current_transformation,o3d.pipelines.registration.TransformationEstimationForColoredICP(),o3d.pipelines.registration.ICPConvergenceCriteria(relative_fitness=1e-6,relative_rmse=1e-6,max_iteration=iter))current_transformation = result_icp.transformationprint(result_icp)
# 可视化
draw_registration_result_original_color(source, target,result_icp.transformation)

使用 voxel_down_sample 创造了三层多分辨率的点云.使用顶点法线估计来计算的法线.核心的配准函数 registration_colored_icp 在每一层从粗糙到精细都有调用.lambda_geometricregistration_colored_icp 中可选的参数,用于确定 ​ 中的 δ ∈ [ 0 , 1 ]。
输出的是两组紧密对齐的点云,注意看上面的绿色三角形.

Open3d之彩色点云配准相关推荐

  1. Open3d学习计划—高级篇 2(彩色点云配准)

    Open3D是一个开源库,支持快速开发和处理3D数据.Open3D在c++和Python中公开了一组精心选择的数据结构和算法.后端是高度优化的,并且是为并行化而设置的. 本系列学习计划有Blue同学作 ...

  2. 教程:Python Open3d 完成 ICP 点云配准

    Python Open3d 完成 ICP 点云配准 关于Open3d Open3D 是一个在Python和C++平台上的三维数据处理与可视化库.它由 Qian-Yi Zhou,Jaesik Park, ...

  3. 点云配准(二)— python open3d ICP方法

    上一节中介绍了点云配准的基础知识.本节将采用python open3d来进行点云配准. open3d安装和点云配准介绍,请参考: Open3d读写ply点云文件_Coding的叶子的博客-CSDN博客 ...

  4. Open3d利用彩色图和深度图生成点云进行室内三维重建

    上一次得到的点云图在累加多张后配准会出现少量离群的点云,效果很差,于是考虑从 ICL-NUIM dataset这个数据集获得官方的室内图进行三维重建,数据集网址如下: ICL-NUIM RGB-D B ...

  5. 基于全景图像与激光点云配准的彩色点云生成算法(2014年文章)

    标题:The algorithm to generate color point-cloud with the registration between panoramic imageand lase ...

  6. Open3d学习计划—高级篇 4(多视角点云配准)

    本文为转载文章,原创作者为blue同学,可关注他的博客:https://blog.csdn.net/io569417668 Open3D是一个开源库,支持快速开发和处理3D数据.Open3D在c++和 ...

  7. Open3d系列 | 1. Open3d实现点云数据读写、点云配准、点云法向量计算

    如有错误,恳请指出. 从这一篇博客开始,开始利用Open3d来处理点云数据.之后将围绕点云数据的多种处理方式来记录笔记.本篇博客的内容包括点云的文件格式介绍,点云数据的读取,以及点云的配准与点云的法向 ...

  8. Open3d读写ply点云文件

    1 Open3d 安装 Open3d是由Intel发布的一个开源库,支持快速开发和处理3D数据.Open3D在c++和Python中公开了一组精心选择的数据结构和算法.后端是高度优化的,并且是为并行化 ...

  9. Open3d读写pcd点云文件

    1 Open3d 安装 Open3d是由Intel发布的一个开源库,支持快速开发和处理3D数据.Open3D在c++和Python中公开了一组精心选择的数据结构和算法.后端是高度优化的,并且是为并行化 ...

最新文章

  1. 解决element-ui表头错位的问题
  2. 学python就业要看哪些书-编程0基础自学Python,踩完这些坑,我才成功就业!
  3. DataReader 要在事务提交前 CLOSE 掉 否则会报一个:已有打开的与此命令相关联的 DataReader,必须首先将它关闭。...
  4. vue2.0 创建项目
  5. CTF-杂项之工具使用汇总(一)
  6. [Angular 依赖注入详谈] Angular Module Providers几种类型的实现源代码具体位置
  7. centos关闭防火墙
  8. c++读取文件夹下特定文件
  9. 一例WINDOWS系统上的JAVA UI卡死
  10. 求任意一个点到任意函数曲线或曲线方程(参数方程)上最近距离点的通用方法,含Matlab实现代码
  11. 0002深度学习初体验-基于Tensorflow and Keras 实现卷积神经网络(CNN-AlexNET)实现CIFAR图像训练
  12. 牛腩新闻发布--本地超链接打不开
  13. Linux修改fstab引起系统无法启动问题的解决方法
  14. 一键式免费借还的智能充电宝租赁
  15. 解决Windows缺少MSCOMCTL.OCX文件无法运行程序问题
  16. Excel:12 个操作小技巧
  17. 什么是Watchdog?
  18. win10如何升级成win11系统
  19. 如何把自己打造成为一名金领架构师-开悟篇
  20. 虚拟机RedHatEenterpriseLinux5安装及Oracle10.2.0安装手记收藏

热门文章

  1. Chrome下的语音控制框架MyVoix.js使用篇(二)
  2. VMWare安装Ubuntu 12.04开启虚拟机的Unity Mode模式
  3. windows2003与文件共享有关的几个进程
  4. Ubuntu中Error: Can‘t find Python executable “python“, you can set the PYTHON env variable.
  5. Dell服务器RAID常用管理命令总结
  6. MegaCli常见命令
  7. IT 日语学习 2012 06
  8. agent python实现 建模_零基础三天学会Python爬虫(第二天)
  9. 【Postgresql】pg掉电后无法重启
  10. 【Python-3.5】绘制随机漫步图