ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Open3d之颜色映射优化

2021-02-09 16:01:37  阅读:324  来源: 互联网

标签:rgbd 映射 color os image Open3d path 优化 o3d


将颜色映射到从深度相机重建的几何形状。由于颜色和深度帧没有完全对齐,使用彩色图像进行纹理映射会导致颜色映射模糊。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 o3dtut


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(os.path.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图像
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])

 

标签:rgbd,映射,color,os,image,Open3d,path,优化,o3d
来源: https://blog.csdn.net/u014072827/article/details/113770790

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有