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

输入

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

# -*- coding:utf-8 -*-
import re
import os
import open3d as o3d
import Open3D.examples.python.open3d_tutorial as o3dtutdef sorted_alphanum(file_list_ordered):"""排序"""convert = lambda text: int(text) if text.isdigit() else textalphanum_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(os.path.join(path, f))]else:file_list = [path + ffor f in os.listdir(path)if os.path.isfile(os.path.join(path, f)) andos.path.splitext(f)[1] == extension]file_list = sorted_alphanum(file_list)return file_list# 加载数据
path = o3dtut.download_fountain_dataset()
debug_mode = False# 生成rgbd图像
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图像来绘制网格。如果没有优化的话,可以看到纹理很模糊。

# 在完全优化之前,让我们先用给定的几何体、RGBD图像和相机姿势来可视化纹理贴图。
option = o3d.pipelines.color_map.ColorMapOptimizationOption()
option.maximum_iteration = 0
with o3d.utility.VerbosityContextManager(o3d.utility.VerbosityLevel.Debug) as cm:o3d.pipelines.color_map.color_map_optimization(mesh, rgbd_images, camera,option)
# 可视化
o3d.visualization.draw_geometries([mesh],zoom=0.5399,front=[0.0665, -0.1107, -0.9916],lookat=[0.7353, 0.6537, 1.0521],up=[0.0136, -0.9936, 0.1118])

刚性优化

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

# 优化纹理并保存网格为texture_mapped.ply
# 实现的论文为:
# Q.-Y. Zhou and V. Koltun,
# Color Map Optimization for 3D Reconstruction with Consumer Depth Cameras,
# SIGGRAPH 2014
option.maximum_iteration = 300
option.non_rigid_camera_coordinate = False
with o3d.utility.VerbosityContextManager(o3d.utility.VerbosityLevel.Debug) as cm:o3d.pipelines.color_map.color_map_optimization(mesh, rgbd_images, camera,option)
o3d.visualization.draw_geometries([mesh],zoom=0.5399,front=[0.0665, -0.1107, -0.9916],lookat=[0.7353, 0.6537, 1.0521],up=[0.0136, -0.9936, 0.1118])


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

非刚性优化

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

option.maximum_iteration = 300
option.non_rigid_camera_coordinate = True
with o3d.utility.VerbosityContextManager(o3d.utility.VerbosityLevel.Debug) as cm:o3d.pipelines.color_map.color_map_optimization(mesh, rgbd_images, camera,option)o3d.visualization.draw_geometries([mesh],zoom=0.5399,front=[0.0665, -0.1107, -0.9916],lookat=[0.7353, 0.6537, 1.0521],up=[0.0136, -0.9936, 0.1118])

Open3d之颜色映射优化相关推荐

  1. Open3D 三维点云读取可视化、下采样、去除离群点、地面提取

    Open3D:3D数据处理的现代库,是一个开放源代码库,支持快速开发处理3D数据的软件.Open3D在C ++和Python中公开了一组精心选择的数据结构和算法.后端经过高度优化,并支持并行化. 推荐 ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. Open3d 学习计划—13(Azure Kinect)

    该文章为转载内容,请关注文章作者博客https://blog.csdn.net/io569417668 Open3D是一个开源库,支持快速开发和处理3D数据.Open3D在c++和Python中公开了 ...

最新文章

  1. 实用的人工智能 但数据 Python 速查表
  2. SQL Server 2008 认证之路
  3. java中utilities类_servletutilities属于哪个java包
  4. Oracle day05 索引_数据去重
  5. windows10 系统设置一键备份
  6. vs+opencv编译出现内存问题
  7. Winform DataGridView中利用WebClient异步加载显示网络地址的图片
  8. 2018杭电多校第六场1009(DFS,思维)
  9. Flink 如何读取和写入 Clickhouse?
  10. access 记录集 filter find属性_[网页编程]-07 jQuery 操作页面元素属性
  11. 华三交换机配置vrrp_h3c vrrp配置实例
  12. java写入到excel表格乱码怎么办,数据库导出excel表格是乱码-java导出excel表格乱码!...
  13. echarts将x轴展示在图标上方
  14. 关于睡眠唤醒实现开机功能
  15. 6月20日打卡50个单词
  16. 计算机组老师颁奖词,获奖教师的颁奖词
  17. python控制步进电机转动_用Python编程:控制步进电机+ Raspberry Pi零+ L293D IC
  18. Linux中/proc/pid/status信息含义
  19. RTSP取流之海康威视
  20. google海底光缆图_总长超过10万公里 谷歌参与投资了13条海底光缆

热门文章

  1. poj题目分类(转)--方便分类做题
  2. string 与stringbuilder的区别
  3. VisualStudio2005英文版被SQL2005简体中文版汉化
  4. Dell服务器通过IDRAC9收集TSR日志排查故障
  5. 优化Nginx的处理性能
  6. 官方文档---ubuntu 安装OpenStack
  7. Excel VBA实现 通过文件名查找全路径
  8. 【Linux】七种运行级别
  9. hadoop异常: java.io.EOFException: Unexpected end of input stream
  10. Android Stduio 发生 Process ‘command ‘somePath:java.exe‘‘ finished with non-zero exit value 2 异常的解决办法