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 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(join(path, f))]else:file_list = [path + ffor 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 = Falsergbd_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 = 0
with 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 2014
option.maximum_iteration = 100 if is_ci else 300
option.non_rigid_camera_coordinate = False
with 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 300
option.non_rigid_camera_coordinate = True
with 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方法介绍
往期线上分享录播汇总
第一期B站录播之三维模型检索技术
第二期B站录播之深度学习在3D场景中的应用
第三期B站录播之CMake进阶学习
第四期B站录播之点云物体及六自由度姿态估计
第五期B站录播之点云深度学习语义分割拓展
第六期B站录播之Pointnetlk解读
[线上分享录播]点云配准概述及其在激光SLAM中的应用
[线上分享录播]cloudcompare插件开发
[线上分享录播]基于点云数据的 Mesh重建与处理
[线上分享录播]机器人力反馈遥操作技术及机器人视觉分享
[线上分享录播]地面点云配准与机载点云航带平差
点云PCL更多活动请查看:点云PCL活动之应届生校招群
扫描下方微信视频号二维码可查看最新研究成果及相关开源方案的演示:
如果你对Open3D感兴趣,或者正在使用该开源方案,就请加入我们,一起翻译,一起学习,贡献自己的力量,目前阶段主要以微信群为主,有意者发送“Open3D学习计划”到公众号后台,和更多热爱分享的小伙伴一起交流吧!如果翻译的有什么问题或者您有更好的意见,请评论交流!!!!
以上内容如有错误请留言评论,欢迎指正交流。如有侵权,请联系删除
扫描二维码
关注我们
让我们一起分享一起学习吧!期待有想法,乐于分享的小伙伴加入免费星球注入爱分享的新鲜活力。分享的主题包含但不限于三维视觉,点云,高精地图,自动驾驶,以及机器人等相关的领域。
分享及合作:微信“920177957”(需要按要求备注) 联系邮箱:dianyunpcl@163.com,欢迎企业来联系公众号展开合作。
点一下“在看”你会更好看耶
Open3d学习计划—高级篇 7(颜色映射)相关推荐
- Open3d学习计划——高级篇 6(体素化)
Open3d学习计划--高级篇 6(体素化) 点云和三角网格是一种十分灵活的,但是不规则的几何类型.体素网格是通过规则的3D网格来表示的另一种3D几何类型,并且它可以看作是2D像素在3D上的对照物.O ...
- Open3d学习计划——高级篇 9(表面重建)
Open3d学习计划--高级篇 9(表面重建) 在许多场景下我们希望生成密集的3D几何形状,比如三角网格.然而从多视图立体算法和深度传感器中我们只能够获得非结构化的点云数据.我们需要使用表面重建算法来 ...
- Open3d学习计划—高级篇 2(彩色点云配准)
Open3D是一个开源库,支持快速开发和处理3D数据.Open3D在c++和Python中公开了一组精心选择的数据结构和算法.后端是高度优化的,并且是为并行化而设置的. 本系列学习计划有Blue同学作 ...
- Open3d学习计划—高级篇 6(体素化)
Open3D是一个开源库,支持快速开发和处理3D数据.Open3D在c++和Python中公开了一组精心选择的数据结构和算法.后端是高度优化的,并且是为并行化而设置的. 本系列学习计划有Blue同学作 ...
- Open3d学习计划—高级篇 5(RGBD融合)
Open3D是一个开源库,支持快速开发和处理3D数据.Open3D在c++和Python中公开了一组精心选择的数据结构和算法.后端是高度优化的,并且是为并行化而设置的. 本系列学习计划有Blue同学作 ...
- Open3d学习计划—高级篇 3(点云全局配准)
Open3D是一个开源库,支持快速开发和处理3D数据.Open3D在c++和Python中公开了一组精心选择的数据结构和算法.后端是高度优化的,并且是为并行化而设置的. 本系列学习计划有Blue同学作 ...
- Open3d学习计划—高级篇 8(网格变形)
Open3D是一个开源库,支持快速开发和处理3D数据.Open3D在c++和Python中公开了一组精心选择的数据结构和算法.后端是高度优化的,并且是为并行化而设置的. 本系列学习计划有Blue同学作 ...
- Open3d学习计划—高级篇 4(多视角点云配准)
本文为转载文章,原创作者为blue同学,可关注他的博客:https://blog.csdn.net/io569417668 Open3D是一个开源库,支持快速开发和处理3D数据.Open3D在c++和 ...
- Open3d学习计划——2(使用帮助与IO)
Open3d学习计划--2 在上篇文章,我们介绍了Open3D是什么,和Python版本的如何安装.本篇文章将介绍原文档中Open3D得基础用法,本文翻译文档为0.10.0版本open3d文档,更多之 ...
最新文章
- python文件和目录
- 小米半年来最大调整:成立技术委员会,雷军称技术事关生死存亡
- 数论分块 ---- 2020牛客多校第7场H-Dividing[思维+数论分块]
- sql 语句 查询两个字段都相同的方法
- 一张图看懂数据防泄漏
- php二维数组排序 按照指定的key 对数组进行排序
- 3G应用上新闻联播 TD-SCDMA被内定?
- C++编程中的四个调试小技巧
- java 静态变量与静态初始化块中变量的初始化顺序
- 从单向链表中删除指定值的节点
- C语言视频教程-谭浩强版-小甲鱼主讲—P19
- 私有云落地解决方案之网络篇-网络架构
- 【网络攻防技术】实验八——SQL注入实验
- Python3 网络爬虫学习手册
- 怎么制作OC材质预设?
- sql server windows nt 64bit 内存占用过高
- 怎么裁剪PDF页面,PDF如何调整页面大小
- 小学最简单的计算机微课PPT,小学音乐微课课件
- Minecraft 命令方块:简易计时器
- Android入门第9天-Android读本地JSON文件并显示
热门文章
- merge into使用方法
- 【原创】linux命令bc使用详解
- c语言的求素数算法,C语言求素数的算法
- cimiss数据_CIMISS,你太优秀了!
- android的布局流程,Android View 布局流程(Layout)全面解析
- 无监督学习与有监督学习的本质区别是什么_人工智能中的无监督学习
- linux卸载hadoop版本,centos6.5 安装hadoop1.2.1的教程详解【亲测版】
- linux sftp 重命名,linux下ssh/sftp配置和权限设置
- php网课资源百度云盘_安全中国PHP网站开发工程师就业指导班 35课 附课件、源码,全套视频教程学习资料通过百度云网盘下载...
- 学校计算机机房好处,浅谈学校计算机机房维护