Open3D中的RedwoodIndoorLivingRoom1
数据集是一个包括相机拍摄的RGB图像、深度图像和相机位姿的数据集。其中,trajectory_path
是指相机在场景中运动的轨迹路径。
trajectory_path
是一个numpy
数组,其维度为(N, 4, 4)
。其中,N
表示轨迹中采样的帧数,4, 4
表示相机位姿的4x4变换矩阵。
轨迹坐标系与世界坐标系一致,即相机运动的轨迹是在世界坐标系下的运动。
通过以下Python代码可以获取RedwoodIndoorLivingRoom1
数据集中的trajectory_path
:
import open3d as o3d
path_to_dataset = "path/to/dataset/RedwoodIndoorLivingRoom1"
# 读取RGB图像、深度图像和相机位姿,并构造Geometry对象
color_raw = o3d.io.read_image(f"{path_to_dataset}/color/00000.jpg")
depth_raw = o3d.io.read_image(f"{path_to_dataset}/depth/00000.png")
rgbd_image = o3d.geometry.RGBDImage.create_from_color_and_depth(
color_raw, depth_raw)
pinhole_camera_intrinsic = o3d.io.read_pinhole_camera_intrinsic(
f"{path_to_dataset}/camera-intrinsics.json")
pose = o3d.io.read_pinhole_camera_pose(f"{path_to_dataset}/trajectory.log")
# 获取轨迹路径
trajectory_path = [pose]
for i in range(1, 200):
color_raw = o3d.io.read_image(f"{path_to_dataset}/color/{i:05d}.jpg")
depth_raw = o3d.io.read_image(f"{path_to_dataset}/depth/{i:05d}.png")
rgbd_image = o3d.geometry.RGBDImage.create_from_color_and_depth(
color_raw, depth_raw)
pose = o3d.io.read_pinhole_camera_pose(
f"{path_to_dataset}/trajectory.log",
i + 1) # 注意,log文件中的位姿是从1开始编号的,而不是从0开始
trajectory_path.append(pose)
trajectory_path = np.array([np.asarray(pose.pose_data)
for pose in trajectory_path])
通过将trajectory_path
的每一帧的变换矩阵与点云或模型进行仿射变换,可以实现相机在场景中运动的动态展示效果。
import open3d as o3d
import numpy as np
path_to_dataset = "path/to/dataset/RedwoodIndoorLivingRoom1"
# 读取点云
pcd = o3d.io.read_point_cloud(f"{path_to_dataset}/cloud_bin_0.pcd")
# 获取轨迹路径
...
# 给点云添加颜色
colors = np.asarray(pcd.colors)
colors[colors == 0] = 1 # Open3D中的点云颜色默认为黑色,将其改为白色
pcd.colors = o3d.utility.Vector3dVector(colors)
# 构建可视化界面
vis = o3d.visualization.Visualizer()
vis.create_window()
vis.add_geometry(pcd)
# 每隔10帧更新一次点云的姿态
for i in range(0, len(trajectory_path), 10):
pcd_new = pcd.transform(trajectory_path[i])
vis.update_geometry(pcd_new)
vis.poll_events()
vis.update_renderer()