推广 热搜: csgo  vue  angelababy  2023  gps  新车  htc  落地  app  p2p 

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

   2023-07-30 网络整理佚名830
核心提示:是一个开源库,支持快速开发和处理3D数据。在c++和中公开了一组精心选择的数据结构和算法。本系列学习计划有Blue同学作为发起人,主要以官方网站的教程为主进行翻译与实践的学习计划。实现了一种可扩展的RGBD图像融合算法。推荐使用后一种的原因是因为使用了多层结构支持大尺度场景.如果有更多的帧被整合,那么空间就会产生更加平滑的网格.

是一个支持快速开发和处理3D数据的开源库。 一组精心挑选的数据结构和算法以 C++ 和 . 后端经过高度优化并设置为并行化。

该系列学习计划由Blue同学发起,主要根据官网教程进行翻译和实践学习计划。 作为一个免费的3D视觉和点云交流社区,点云PCL公众号期待使用或有兴趣加入我们翻译计划的人,为免费交流社区做出贡献,并为用户提供中文教程。

ps:我感觉这一章的名字应该叫通过RGBD数据生成网格。 关于本章的内容,建议大家去百度搜索一下TSDF算法的博客,或者直接阅读下面给出的参考论文,有助于理解)

实现了可扩展的RGBD图像融合算法。 该算法基于[]和[]提出的技术。 为了支持大规模场景,我们使用n中引入的分层哈希结构。

从 .log 文件读取跟踪

本教程使用函数从 .log 文件读取相机轨迹。 示例 .log 文件如下:

# //RGBD/.log

0   0   11   0   0   20   1   0   20   0   1 -0.30   0   0   11   1   20.999988  3.08668e-005  0.0049181  1.99962-8.84184e-005  0.999932  0.0117022  1.97704-0.0049174  -0.0117024  0.999919  -0.3004860  0  0  1

class CameraPose:    def __init__(self, meta, mat):        self.metadata = meta        self.pose = mat

def __str__(self): return 'metadata: ' + ' '.join(map(str, self.metadata)) + '\n' + \ "Pose : " + "\n" + np.array_str(self.pose)

def read_trajectory(filename): traj = [] with open(filename, 'r') as f: metastr = f.readline() while metastr: metadata = list(map(int, metastr.split())) mat = np.zeros(shape=(4, 4)) for i in range(4): matstr = f.readline() mat[i, :] = np.fromstring(matstr, dtype=float, sep=' \t') traj.append(CameraPose(metadata, mat)) metastr = f.readline() return traj

camera_poses = read_trajectory("../../TestData/RGBD/odometry.log")

TSDF 空间融合 (TSDF)

提供了两种类型的 TSDF 空间: 和 。 推荐后者的原因是因为采用多层结构来支持大规模场景。

有几个参数。

浮点类型强度也可以通过 = 传递。 和

sity=True 已集成。 色彩整合的灵感来自于 PCL。

volume = o3d.integration.ScalableTSDFVolume(    voxel_length=4.0 / 512.0,    sdf_trunc=0.04,    color_type=o3d.integration.TSDFVolumeColorType.RGB8)

for i in range(len(camera_poses)): print("Integrate {:d}-th image into the volume.".format(i)) color = o3d.io.read_image( "../../TestData/RGBD/color/{:05d}.jpg".format(i)) depth = o3d.io.read_image( "../../TestData/RGBD/depth/{:05d}.png".format(i)) rgbd = o3d.geometry.RGBDImage.create_from_color_and_depth( color, depth, depth_trunc=4.0, convert_rgb_to_intensity=False) volume.integrate( rgbd, o3d.camera.PinholeCameraIntrinsic( o3d.camera.PinholeCameraIntrinsicParameters.PrimeSenseDefault), np.linalg.inv(camera_poses[i].pose))

第 0 个图像进入 .

第 1 个图像进入 .

第 2 个图像进入 .

第 3 个图像进入 .

第 4 个图像进入 .

提取网格

使用[]中提出的立方体算法进行网格绘制。

print("Extract a triangle mesh from the volume and visualize it.")mesh = volume.extract_triangle_mesh()mesh.compute_vertex_normals()o3d.visualization.draw_geometries([mesh], front=[0.5297, -0.1873, -0.8272],                                  lookat=[2.0712, 2.0312, 1.7251],                                  up=[-0.0558, -0.9809, 0.1864], zoom=0.47)

笔记:

TSDF 空间就像 3D 空间中的加权平均滤波器。 如果集成更多的框架,空间将产生更平滑的网格。 请参阅 Make 中的更多示例。

资源

 
标签: 算法
反对 0举报 0 收藏 0 打赏 0评论 0
 
更多>同类资讯
推荐图文
推荐资讯
点击排行
网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报
Powered By DESTOON