如何在Open3D中利用两类点云实现旋转、变换及RGBD图像投影?
在Open3D中实现点云旋转、变换并投影到RGBD图像的解决方案
Open3D的两类点云(open3d.geometry.PointCloud和open3d.t.geometry.PointCloud)各自绑定了不同的功能集,你可以通过类型转换或手动实现缺失功能的方式打通旋转、变换、投影的全流程,以下是两种可行方案:
方案1:传统点云完成旋转变换,转张量点云投影
利用传统点云成熟的旋转矩阵生成能力完成变换,再转成支持投影的张量点云,是最直接的路径:
import open3d as o3d import open3d.t.geometry as t_geom # 1. 创建/加载传统点云 pcd = o3d.io.read_point_cloud("your_point_cloud.ply") # 2. 生成旋转矩阵并完成点云变换 # 传入XYZ轴的旋转弧度值,生成对应旋转矩阵 rotation_mat = o3d.geometry.get_rotation_matrix_from_xyz((0.2, 0.3, 0.1)) pcd.transform(rotation_mat) # 3. 转换为张量点云(支持CUDA加速,可加 .cuda() 移到GPU) t_pcd = t_geom.PointCloud.from_legacy(pcd) # 4. 加载RGBD图像与相机内参 rgbd_img = o3d.io.read_rgbd_image("your_rgbd_image.png") intrinsic = o3d.camera.PinholeCameraIntrinsic( o3d.camera.PinholeCameraIntrinsicParameters.PrimeSenseDefault ) # 转成张量框架兼容的内参格式 t_intrinsic = t_geom.PinholeCameraIntrinsic(intrinsic) # 5. 投影到RGBD图像 projected_pcd = t_pcd.project_to_rgbd_image(rgbd_img, t_intrinsic)
方案2:直接在张量点云框架下实现旋转变换
如果想全程使用张量点云,可手动构造旋转矩阵(基于PyTorch张量操作),再完成变换与投影:
import open3d as o3d import open3d.t.geometry as t_geom import torch # 1. 创建/加载张量点云 t_pcd = t_geom.PointCloud.from_file("your_point_cloud.ply") # 2. 手动生成XYZ旋转矩阵(传入弧度值) rx, ry, rz = 0.2, 0.3, 0.1 # 构造各轴旋转矩阵 Rx = torch.tensor([ [1, 0, 0], [0, torch.cos(rx), -torch.sin(rx)], [0, torch.sin(rx), torch.cos(rx)] ]) Ry = torch.tensor([ [torch.cos(ry), 0, torch.sin(ry)], [0, 1, 0], [-torch.sin(ry), 0, torch.cos(ry)] ]) Rz = torch.tensor([ [torch.cos(rz), -torch.sin(rz), 0], [torch.sin(rz), torch.cos(rz), 0], [0, 0, 1] ]) # 组合成最终旋转矩阵(XYZ顺序) rotation_mat = Rz @ Ry @ Rx # 构造4x4变换矩阵(兼容点云transform方法) transform_mat = torch.eye(4) transform_mat[:3, :3] = rotation_mat # 3. 应用变换到张量点云 t_pcd.transform(transform_mat) # 4. 投影到RGBD图像(同方案1步骤4-5) rgbd_img = o3d.io.read_rgbd_image("your_rgbd_image.png") intrinsic = o3d.camera.PinholeCameraIntrinsic( o3d.camera.PinholeCameraIntrinsicParameters.PrimeSenseDefault ) t_intrinsic = t_geom.PinholeCameraIntrinsic(intrinsic) projected_pcd = t_pcd.project_to_rgbd_image(rgbd_img, t_intrinsic)
额外说明
两类点云可通过from_legacy()和to_legacy()方法互相转换,你可以根据需求在不同阶段切换使用对应的API;如果需要CUDA加速,张量点云可通过t_pcd.cuda()移至GPU操作。
内容的提问来源于stack exchange,提问作者hjy
相关产品推荐
相关产品推荐

