Open3d学习计划—7(RGBD测程法)

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

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

读取相机内参(camera intrinsic)

RGBD测程法(RGBD Odometry)是去寻找两个RGBD图像之间的相机移动。他的输入是一对RGBImage的实例,输出是刚体变换形式的运动。Open3d实现了 [Steinbrucker2011] and [Park2017]中的方法。

我们首先从json文件中读取相机内参。

pinhole_camera_intrinsic = o3d.io.read_pinhole_camera_intrinsic( "../../TestData/camera_primesense.json")print(pinhole_camera_intrinsic.intrinsic_matrix)

[[525. 0. 319.5]
[ 0. 525. 239.5]
[ 0. 0. 1. ]]

Note:
Open3d 中许多小的数据结构都能够通过json文件来读写。包括相机参数,相机轨迹,姿态图等等。

读取RGBD图像

这个代码块是中读取两对Redwood格式的RGBD图像。我们提供了Redwood数据集的解释(在前一节有介绍)。

source_color = o3d.io.read_image("../../TestData/RGBD/color/00000.jpg")source_depth = o3d.io.read_image("../../TestData/RGBD/depth/00000.png")target_color = o3d.io.read_image("../../TestData/RGBD/color/00001.jpg")target_depth = o3d.io.read_image("../../TestData/RGBD/depth/00001.png")source_rgbd_image = o3d.geometry.RGBDImage.create_from_color_and_depth( source_color, source_depth)target_rgbd_image = o3d.geometry.RGBDImage.create_from_color_and_depth( target_color, target_depth)target_pcd = o3d.geometry.PointCloud.create_from_rgbd_image( target_rgbd_image, pinhole_camera_intrinsic)

Note:
Open3d假设彩色图像和深度图像是同步的,并且在同一坐标系下配准。这通常可以在RGBD相机中通过打开同步和配准设置来实现。

从一对RGBD图像中计算里程

option = o3d.odometry.OdometryOption()odo_init = np.identity(4)print(option)[success_color_term, trans_color_term, info] = o3d.odometry.compute_rgbd_odometry( source_rgbd_image, target_rgbd_image, pinhole_camera_intrinsic, odo_init, o3d.odometry.RGBDOdometryJacobianFromColorTerm(), option)[success_hybrid_term, trans_hybrid_term, info] = o3d.odometry.compute_rgbd_odometry( source_rgbd_image, target_rgbd_image, pinhole_camera_intrinsic, odo_init, o3d.odometry.RGBDOdometryJacobianFromHybridTerm(), option)

odometry::OdometryOption class.
iteration_number_per_pyramid_level = [ 20, 10, 5, ]
max_depth_diff = 0.030000
min_depth = 0.000000
max_depth = 4.000000

这个代码块调用两种不同的RGBD测程方法。第一种来自[Steinbrucker2011].他是去最小化对齐图片的颜色一致性(It minimizes photo consistency of aligned images )。第二种算法来自[Park2017]。除了颜色一致性以外,他还实现了几何约束。这两种方法运行速度接近。但是[Park2017]在我们的基准数据集中有着更高的精度,所以我们推荐使用。
OdometryOption()有几个参数:

minimum_correspondence_ratio:对齐后,测量两张RGBD图像的重叠比率。如果两组RGBD图像的重叠区域小于指定的比例,则测程模块会认为这是失效的情况。

max_depth_diff:在深度图像中,如果两个对齐的像素的深度差异是小于一个值的,则认为它们是对应的。值越大,搜索越激进,但是结果越不容易稳定。

min_depth 和 max_depth:大于或小于指定深度的像素会被忽略。

可视化RGBD图像对

将RGBD图像对转换成点云并且一起渲染。要注意的是,第一个(源)RGBD图像是通过测程法估计出的变换来进行变换的。经过变化之后的两组点云是对齐的。

if success_color_term: print("Using RGB-D Odometry") print(trans_color_term) source_pcd_color_term = o3d.geometry.PointCloud.create_from_rgbd_image( source_rgbd_image, pinhole_camera_intrinsic) source_pcd_color_term.transform(trans_color_term) o3d.visualization.draw_geometries([target_pcd, source_pcd_color_term], zoom=0.48, front=[0.0999, -0.1787, -0.9788], lookat=[0.0345, -0.0937, 1.8033], up=[-0.0067, -0.9838, 0.1790])if success_hybrid_term: print("Using Hybrid RGB-D Odometry") print(trans_hybrid_term) source_pcd_hybrid_term = o3d.geometry.PointCloud.create_from_rgbd_image( source_rgbd_image, pinhole_camera_intrinsic) source_pcd_hybrid_term.transform(trans_hybrid_term) o3d.visualization.draw_geometries([target_pcd, source_pcd_hybrid_term], zoom=0.48, front=[0.0999, -0.1787, -0.9788], lookat=[0.0345, -0.0937, 1.8033], up=[-0.0067, -0.9838, 0.1790])

Using RGB-D Odometry
[[ 9.99988286e-01 -7.53983409e-05 -4.83963172e-03 2.74054550e-04]
[ 1.83909052e-05 9.99930634e-01 -1.17782559e-02 2.29634918e-02]
[ 4.84018408e-03 1.17780289e-02 9.99918922e-01 6.02121265e-04]
[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00]]

Using Hybrid RGB-D Odometry

[[ 9.99992973e-01 -2.51084541e-04 -3.74035273e-03 -1.07049775e-03]

[ 2.07046059e-04 9.99930714e-01 -1.17696227e-02 2.32280983e-02]

[ 3.74304875e-03 1.17687656e-02 9.99923740e-01 1.40592054e-03]

[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00]]

如果你对Open3D感兴趣,或者正在使用该开源方案,就请加入我们,一起翻译,一起学习,贡献自己的力量,目前阶段主要以微信群为主,有意者发送“Open3D学习计划”到公众号后台,和更多热爱分享的小伙伴一起交流吧!如果翻译的有什么问题或者您有更好的意见,请评论交流!!!!

以上内容如有错误请留言评论,欢迎指正交流。如有侵权,请联系删除

扫描二维码

关注我们

让我们一起分享一起学习吧!期待有想法,乐于分享的小伙伴加入免费星球注入爱分享的新鲜活力。分享的主题包含但不限于三维视觉,点云,高精地图,自动驾驶,以及机器人等相关的领域。

(0)

相关推荐

  • Open3d之颜色映射优化

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

  • 灯检可见异物分类方法标准化!

    由辉瑞.阿斯利康.拜耳等17家单位组成的课题小组发布了<注射剂可见异物分类方法标准化白皮书>(AN INDUSTRY-WIDE STANDARDIZED METHODOLOGY AND R ...

  • source

    'Pittsburgh is the source of the Ohio River' 'communism's Russian root' a document (or organization) ...

  • 孔径可调的针孔镜头终于问世!

    文/大智 针孔镜头拍摄的照片有一种独特的美感. 光影寂寂,雾朦朦. (Nikon D800 + Pinhole Pro 针孔镜头所摄) 针孔镜头进光量极少,需要较长的曝光时间才能完整成像. 这便造就了 ...

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

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

  • Open3d学习计划—6(RGBD图像)

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

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

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

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

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

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

    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同学作 ...