是一个支持快速开发和处理3D数据的开源库。 一组精心挑选的数据结构和算法以 C++ 和 . 后端经过高度优化并设置为并行化。
该系列学习计划由Blue同学发起,主要根据官网教程进行翻译和实践学习计划。 作为一个免费的3D视觉和点云交流社区,点云PCL公众号期待使用或有兴趣加入我们翻译计划的人,为免费交流社区做出贡献,并为用户提供中文教程。
ps:我感觉这一章的名字应该叫通过RGBD数据生成网格。 关于本章的内容,建议大家去百度搜索一下TSDF算法的博客,或者直接阅读下面给出的参考论文,有助于理解)
实现了可扩展的RGBD图像融合算法。 该算法基于[]和[]提出的技术。 为了支持大规模场景,我们使用n中引入的分层哈希结构。
从 .log 文件读取跟踪
本教程使用函数从 .log 文件读取相机轨迹。 示例 .log 文件如下:
# //RGBD/.log
0 0 1
1 0 0 2
0 1 0 2
0 0 1 -0.3
0 0 0 1
1 1 2
0.999988 3.08668e-005 0.0049181 1.99962
-8.84184e-005 0.999932 0.0117022 1.97704
-0.0049174 -0.0117024 0.999919 -0.300486
0 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 中的更多示例。
资源