import open3d as o3d
import numpy as np
# 예시로 사용할 점 집합 (point cloud) 생성
points = np.random.rand(100, 3) # 100개의 랜덤 점 생성
pcd = o3d.geometry.PointCloud()
pcd.points = o3d.utility.Vector3dVector(points)
# Axis-Aligned Bounding Box (AABB) 생성
aabb = pcd.get_axis_aligned_bounding_box()
# Oriented Bounding Box (OBB) 생성
obb = pcd.get_oriented_bounding_box()
# AABB와 OBB 정보 출력
print("Axis-Aligned Bounding Box:")
print(f"Center: {aabb.get_center()}")
print(f"Extent: {aabb.get_extent()}")
print(f"Min Bound: {aabb.get_min_bound()}")
print(f"Max Bound: {aabb.get_max_bound()}")
print("\nOriented Bounding Box:")
print(f"Center: {obb.get_center()}")
print(f"Extent: {obb.get_extent()}")
print(f"Rotation Matrix: \n{obb.R}")
print(f"Min Bound: {obb.get_min_bound()}")
print(f"Max Bound: {obb.get_max_bound()}")
# Bounding Box를 시각화
o3d.visualization.draw_geometries([pcd, aabb, obb])
점 집합 (Point Cloud) 생성:
points
는 100개의 랜덤 3D 점들을 생성합니다.pcd
는 이 점 집합을 포함하는 Open3D의 PointCloud 객체입니다.Axis-Aligned Bounding Box (AABB):
aabb = pcd.get_axis_aligned_bounding_box()
는 주어진 점 집합을 포함하는 축 정렬(Axis-Aligned)된 3D bounding box를 생성합니다.Oriented Bounding Box (OBB):
obb = pcd.get_oriented_bounding_box()
는 주어진 점 집합을 포함하는 회전된(Oriented) 3D bounding box를 생성합니다.Bounding Box 정보 출력:
Center
), 범위 (Extent
), 최소 및 최대 경계 (Min Bound
, Max Bound
)를 출력합니다.Rotation Matrix
)도 출력합니다.시각화:
o3d.visualization.draw_geometries
를 사용하여 점 집합과 두 가지 bounding box를 시각화합니다.이 코드를 통해 3D 점 집합에 대한 Axis-Aligned Bounding Box (AABB)와 Oriented Bounding Box (OBB)의 정보를 추출하고 시각화할 수 있습니다.
PyTorch3D를 사용하여 3D bounding box를 정의하고 정보를 추출하는 코드 예시는 다음과 같습니다. 이 예시에서는 주로 3D 점 집합을 기준으로 axis-aligned bounding box를 계산하고 그 정보를 출력합니다.
import torch
from pytorch3d.structures import Pointclouds
from pytorch3d.ops import boxes as box_ops
# 랜덤으로 3D 점 집합 생성 (batch_size=1, num_points=100, num_coords=3)
points = torch.rand((1, 100, 3)) # 1개의 점 집합(batch)에 100개의 3D 점
# Pointclouds 객체 생성
point_cloud = Pointclouds(points=points)
# Axis-Aligned Bounding Box 계산
# bounding box는 (batch_size, 2, 3) 모양의 텐서로 반환되며, 각 배치의 첫 번째 요소는 min point, 두 번째 요소는 max point입니다.
aabb = box_ops.get_3d_bounding_box(point_cloud)
# AABB의 최소 및 최대 점 (Min Point와 Max Point) 추출
min_point = aabb[:, 0, :] # shape: (batch_size, 3)
max_point = aabb[:, 1, :] # shape: (batch_size, 3)
# AABB의 중간 점 (Center)와 크기 (Size) 계산
center = (min_point + max_point) / 2.0
size = max_point - min_point
# AABB 정보 출력
print("Axis-Aligned Bounding Box:")
print(f"Min Point: {min_point}")
print(f"Max Point: {max_point}")
print(f"Center: {center}")
print(f"Size: {size}")
3D 점 집합 생성:
points
는 크기가 (1, 100, 3)
인 텐서로, 1개의 배치(batch)로 100개의 3D 점을 무작위로 생성합니다.Pointclouds 객체 생성:
point_cloud
는 PyTorch3D의 Pointclouds
객체로, 3D 점 집합을 나타냅니다.Axis-Aligned Bounding Box (AABB) 계산:
box_ops.get_3d_bounding_box
를 사용하여 각 점 집합의 axis-aligned bounding box를 계산합니다. 결과는 (batch_size, 2, 3)
모양의 텐서로 반환되며, 첫 번째 축은 배치를 나타내고, 두 번째 축은 최소 및 최대 점을 나타냅니다.AABB 정보 추출:
min_point
와 max_point
는 각각 bounding box의 최소 및 최대 점을 나타냅니다.center
는 bounding box의 중심점이고, size
는 bounding box의 크기(가로, 세로, 높이)입니다.AABB 정보 출력:
이 코드를 사용하면 PyTorch3D에서 3D 점 집합의 bounding box 정보를 쉽게 추출할 수 있습니다.