Pointclouds
클래스는 3D 포인트 클라우드를 효율적으로 관리하고 조작하기 위한 클래스Pointclouds
클래스는 포인트 클라우드 데이터를 두 가지 형태로 저장할 수 있습니다:
(N_b, 3)
형식의 텐서 리스트로 저장N_b
는 각 배치에서의 포인트 수(B, max(N_b), 3)
형식의 텐서에 저장하고, 필요한 경우 0으로 패딩B
는 배치 크기입니다.각 포인트는 다음과 같은 속성을 가질 수 있습니다:
(X, Y, Z)
를 나타냅니다.(N_x, N_y, N_z)
를 나타냅니다.(R, G, B)
를 나타냅니다.C
각 속성은 리스트 또는 패딩된 텐서 형태로 저장될 수 있습니다.
Pointclouds
클래스는 포인트 클라우드를 다양한 방식으로 조작할 수 있는 메서드를 제공
rotate_
)하거나 변환(transform_
)scale_
)할 수 있음offset_
)할 수 있습음pinhole_projection_
)할 수 있습니다.save_to_h5
)할 수 있습니다.load_pointcloud_from_h5
)할 수 있습니다.open3d
라이브러리를 사용하여 포인트 클라우드를 시각화(open3d
)할 수 있음plotly
라이브러리를 사용하여 포인트 클라우드를 3D 그래프로 시각화(plotly
)할 수 있음클래스 내부에서는 여러 속성을 사용하여 포인트 클라우드의 상태를 관리합니다:
points_list = [torch.rand(1, 3), torch.rand(4, 3)]
pcs1 = Pointclouds(points_list)
print(pcs1.points_padded.shape) # torch.Size([2, 4, 3])
print(len(pcs1.points_list)) # 2
# 4x4 변환 행렬을 사용하여 포인트 클라우드 변환
transform = torch.eye(4)
pcs1.transform_(transform)
# 포인트 클라우드 저장
pcs1.save_to_h5('path/to/save')
# 포인트 클라우드 로드
loaded_pcs = Pointclouds.load_pointcloud_from_h5('path/to/save')
import open3d as o3d
# Open3D를 사용한 시각화
pcd = pcs1.open3d(index=0)
o3d.visualization.draw_geometries([pcd])
open3d
open3d
메서드는 배치 내의 특정 포인트 클라우드
를 open3d.geometry.PointCloud
객체로 변환색상 정보, 법선 벡터 포함 여부
및 포인트 클라우드에서 최대 포인트 수를 설정하는 옵션
을 제공index (int):
int
include_colors (bool):
open3d.geometry.PointCloud
객체에 색상 정보를 포함True
max_num_points (Optional[int]):
Optional[int]
None
include_normals (bool):
open3d.geometry.PointCloud
객체에 법선 벡터를 포함합니다.False
open3d.geometry.PointCloud
객체포인트 클라우드 초기화:
open3d.geometry.PointCloud
객체를 생성합니다.pcd = o3d.geometry.PointCloud()
포인트 샘플링(필요한 경우):
max_num_points
와 전체 포인트 수를 비교하여 샘플링이 필요한지 확인합니다.num_points = self.num_points_per_pointcloud[index]
torch_points = self.points_list[index]
subsample = max_num_points is not None and max_num_points < num_points
if subsample:
perm = torch.randperm(num_points)
point_inds = perm[:max_num_points]
torch_points = torch_points[point_inds]
포인트를 NumPy 배열로 변환:
open3d.geometry.PointCloud
객체에 포인트를 설정합니다.numpy_points = torch_points.detach().cpu().numpy()
pcd.points = o3d.utility.Vector3dVector(numpy_points)
색상 포함(필요한 경우):
open3d.geometry.PointCloud
객체에 설정합니다.if self.has_colors and include_colors:
torch_colors = self.colors_list[index]
if subsample:
torch_colors = torch_colors[point_inds]
if (torch_colors.max() > 1.1).item():
torch_colors = torch_colors / 255
torch_colors = torch.clamp(torch_colors, min=0.0, max=1.0)
numpy_colors = torch_colors.detach().cpu().numpy()
pcd.colors = o3d.utility.Vector3dVector(numpy_colors)
법선 포함(필요한 경우):
open3d.geometry.PointCloud
객체에 설정합니다.if self.has_normals and include_normals:
torch_normals = self.normals_list[index]
if subsample:
torch_normals = torch_normals[point_inds]
numpy_normals = torch_normals.detach().cpu().numpy()
pcd.normals = o3d.utility.Vector3dVector(numpy_normals)
포인트 클라우드 반환:
open3d.geometry.PointCloud
객체를 반환합니다.return pcd