Open3d学习计划—高级篇 7(颜色映射)

Open3D是一个开源库,支持快速开发和处理3D数据。Open3D在c++和Python中公开了一组精心选择的数据结构和算法。后端是高度优化的,并且是为并行化而设置的。

本系列学习计划有Blue同学作为发起人,主要以Open3D官方网站的教程为主进行翻译与实践的学习计划。点云PCL公众号作为免费的3D视觉,点云交流社区,期待有使用Open3D或者感兴趣的小伙伴能够加入我们的翻译计划,贡献免费交流社区,为使用Open3D提供中文的使用教程。

将颜色映射到从深度相机重建的几何形状。由于彩色帧和深度帧不一定是完美对齐的,所以使用彩色图像进行纹理映射的结果会导致一个模糊的彩色映射。Open3d提供了基于[Zhou2014]中的彩色映射优化算法。下面的教程将会提供彩色映射优化算法的示例。

输入

下面的代码读取彩色和深度图像对,并且生成 rgbd_image。注意convert_rgb_to_intensity标志位设置为 False。只是为了保留8-bit彩色通道而不是使用单通道浮点型图像。
在应用彩色映射优化之前,最好先对RGBD图像进行可视化。debug_mode选择是否可视化RGBD图像。

def sorted_alphanum(file_list_ordered): convert = lambda text: int(text) if text.isdigit() else text alphanum_key = lambda key: [convert(c) for c in re.split('([0-9]+)', key)] return sorted(file_list_ordered, key=alphanum_key)

def get_file_list(path, extension=None): if extension is None: file_list = [path + f for f in os.listdir(path) if os.path.isfile(join(path, f))] else: file_list = [ path + f for f in os.listdir(path) if os.path.isfile(os.path.join(path, f)) and os.path.splitext(f)[1] == extension ] file_list = sorted_alphanum(file_list) return file_list
path = o3dtut.download_fountain_dataset()debug_mode = False

rgbd_images = []depth_image_path = get_file_list(os.path.join(path, "depth/"), extension=".png")color_image_path = get_file_list(os.path.join(path, "image/"), extension=".jpg")assert (len(depth_image_path) == len(color_image_path))for i in range(len(depth_image_path)): depth = o3d.io.read_image(os.path.join(depth_image_path[i])) color = o3d.io.read_image(os.path.join(color_image_path[i])) rgbd_image = o3d.geometry.RGBDImage.create_from_color_and_depth( color, depth, convert_rgb_to_intensity=False) if debug_mode: pcd = o3d.geometry.PointCloud.create_from_rgbd_image( rgbd_image, o3d.camera.PinholeCameraIntrinsic( o3d.camera.PinholeCameraIntrinsicParameters. PrimeSenseDefault)) o3d.visualization.draw_geometries([pcd]) rgbd_images.append(rgbd_image)

下面的代码读取相机轨迹和网格数据

camera = o3d.io.read_pinhole_camera_trajectory( os.path.join(path, "scene/key.log"))mesh = o3d.io.read_triangle_mesh( os.path.join(path, "scene", "integrated.ply"))

为了可视化出相机的姿态不适合颜色映射,下面的代码故意设置迭代次数为0,也就是不对其映射做优化。color_map_optimization使用对应的相机姿态和RGBD图像来绘制网格。如果没有优化的话,可以看到纹理很模糊。

# Before full optimization, let's just visualize texture map# with given geometry, RGBD images, and camera poses.option = o3d.color_map.ColorMapOptimizationOption()option.maximum_iteration = 0with o3d.utility.VerbosityContextManager(o3d.utility.VerbosityLevel.Debug) as cm: o3d.color_map.color_map_optimization(mesh, rgbd_images, camera, option)o3d.visualization.draw_geometries([mesh])

刚性优化

下一步优化相机参数来获得清晰的彩色图像。
下面的代码设置最大迭代次数为300。

# Optimize texture and save the mesh as texture_mapped.ply# This is implementation of following paper# Q.-Y. Zhou and V. Koltun,# Color Map Optimization for 3D Reconstruction with Consumer Depth Cameras,# SIGGRAPH 2014option.maximum_iteration = 100 if is_ci else 300option.non_rigid_camera_coordinate = Falsewith o3d.utility.VerbosityContextManager(o3d.utility.VerbosityLevel.Debug) as cm: o3d.color_map.color_map_optimization(mesh, rgbd_images, camera, option)o3d.visualization.draw_geometries([mesh])

残差表示图像强度不一致,残差越低表示颜色映射质量越好。ColorMapOptimizationOption默认使用刚性优化,去优化相机的六维姿态。

非刚性优化

为了有一个更好的映射质量,需要使用非刚性优化。要启用非刚性优化只需要在调用color_map_optimization前将option.non_rigid_camera_coordinate设置为True。除了六维相机姿态以外,非刚性优化甚至考虑了由锚点表示的局部图像变形。这种方式更加灵活并且会有着更高的彩色映射质量。残差也会小于刚性优化的情况。

option.maximum_iteration = 100 if is_ci else 300option.non_rigid_camera_coordinate = Truewith o3d.utility.VerbosityContextManager(o3d.utility.VerbosityLevel.Debug) as cm: o3d.color_map.color_map_optimization(mesh, rgbd_images, camera, option)o3d.visualization.draw_geometries([mesh])

资源

三维点云论文及相关应用分享

【点云论文速读】基于激光雷达的里程计及3D点云地图中的定位方法

3D目标检测:MV3D-Net

三维点云分割综述(上)

3D-MiniNet: 从点云中学习2D表示以实现快速有效的3D LIDAR语义分割(2020)

win下使用QT添加VTK插件实现点云可视化GUI

JSNet:3D点云的联合实例和语义分割

大场景三维点云的语义分割综述

PCL中outofcore模块---基于核外八叉树的大规模点云的显示

基于局部凹凸性进行目标分割

基于三维卷积神经网络的点云标记

点云的超体素(SuperVoxel)

基于超点图的大规模点云分割

更多文章可查看:点云学习历史文章大汇总

SLAM及AR相关分享

【开源方案共享】ORB-SLAM3开源啦!

【论文速读】AVP-SLAM:自动泊车系统中的语义SLAM

【点云论文速读】StructSLAM:结构化线特征SLAM

SLAM和AR综述

常用的3D深度相机

AR设备单目视觉惯导SLAM算法综述与评价

SLAM综述(4)激光与视觉融合SLAM

Kimera实时重建的语义SLAM系统

SLAM综述(3)-视觉与惯导,视觉与深度学习SLAM

易扩展的SLAM框架-OpenVSLAM

高翔:非结构化道路激光SLAM中的挑战

SLAM综述之Lidar SLAM

基于鱼眼相机的SLAM方法介绍

(0)

相关推荐

  • 老板让很快处理数百图片,我该辞职吗

    来源:Python 技术「ID: pythonall」 工作种常常会遇到一些棘手的问题,干好了名利双收,干不好就可能失去工作机会,特别是在疫情严重的现在,裁员压力很大:( 从天而降 小派同学,刚进公司 ...

  • 想要利用Python快速爬取整站图片?速进(附完整代码)

    目录 一. 爬取前的准备 二. 查看网页 三. 分析与实现 1. 先确定我们所要爬取内容的具体位置2. 存储的具体实现 (`在pipelines中处理`)3. 更新完善源码 四. 代码   快速爬取整 ...

  • Open3d之颜色映射优化

    将颜色映射到从深度相机重建的几何形状.由于颜色和深度帧没有完全对齐,使用彩色图像进行纹理映射会导致颜色映射模糊.Open3D提供了基于[Zhou2014]中的颜色映射优化算法.下面的教程将会提供彩色映 ...

  • 3D目标检测/点云/遥感数据集汇总

    重磅干货,第一时间送达 作者丨Belouga- 来源丨https://blog.csdn.net/weixin_44330777/article/details/109456866 编辑丨极市平台 本 ...

  • Open3d学习计划—高级篇 8(网格变形)

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

  • Open3d学习计划—高级篇 6(体素化)

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

  • Open3d学习计划—高级篇 5(RGBD融合)

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

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

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

  • Open3d学习计划—高级篇 3(点云全局配准)

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

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

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

  • Open3d学习计划—高级篇 1(点云离群点移除)

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

  • Open3d 学习计划—13(Azure Kinect)

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

  • Open3d 学习计划—12(Jupyter 可视化)

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