3D bounding box

About_work·2024년 8월 10일
0

vision

목록 보기
1/1

1. Open3D

  • Axis-Aligned Bounding Box (AABB)
  • Oriented Bounding Box (OBB)
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])

코드 설명:

  1. 점 집합 (Point Cloud) 생성:

    • points는 100개의 랜덤 3D 점들을 생성합니다.
    • pcd는 이 점 집합을 포함하는 Open3D의 PointCloud 객체입니다.
  2. Axis-Aligned Bounding Box (AABB):

    • aabb = pcd.get_axis_aligned_bounding_box()는 주어진 점 집합을 포함하는 축 정렬(Axis-Aligned)된 3D bounding box를 생성합니다.
  3. Oriented Bounding Box (OBB):

    • obb = pcd.get_oriented_bounding_box()는 주어진 점 집합을 포함하는 회전된(Oriented) 3D bounding box를 생성합니다.
  4. Bounding Box 정보 출력:

    • 각 bounding box의 중심점 (Center), 범위 (Extent), 최소 및 최대 경계 (Min Bound, Max Bound)를 출력합니다.
    • OBB의 경우, 회전 행렬 (Rotation Matrix)도 출력합니다.
  5. 시각화:

    • o3d.visualization.draw_geometries를 사용하여 점 집합과 두 가지 bounding box를 시각화합니다.

이 코드를 통해 3D 점 집합에 대한 Axis-Aligned Bounding Box (AABB)와 Oriented Bounding Box (OBB)의 정보를 추출하고 시각화할 수 있습니다.


2. PyTorch3D

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}")

코드 설명:

  1. 3D 점 집합 생성:

    • points는 크기가 (1, 100, 3)인 텐서로, 1개의 배치(batch)로 100개의 3D 점을 무작위로 생성합니다.
  2. Pointclouds 객체 생성:

    • point_cloud는 PyTorch3D의 Pointclouds 객체로, 3D 점 집합을 나타냅니다.
  3. Axis-Aligned Bounding Box (AABB) 계산:

    • box_ops.get_3d_bounding_box를 사용하여 각 점 집합의 axis-aligned bounding box를 계산합니다. 결과는 (batch_size, 2, 3) 모양의 텐서로 반환되며, 첫 번째 축은 배치를 나타내고, 두 번째 축은 최소 및 최대 점을 나타냅니다.
  4. AABB 정보 추출:

    • min_pointmax_point는 각각 bounding box의 최소 및 최대 점을 나타냅니다.
    • center는 bounding box의 중심점이고, size는 bounding box의 크기(가로, 세로, 높이)입니다.
  5. AABB 정보 출력:

    • 계산된 최소/최대 점, 중심점, 그리고 크기를 출력합니다.

이 코드를 사용하면 PyTorch3D에서 3D 점 집합의 bounding box 정보를 쉽게 추출할 수 있습니다.

profile
새로운 것이 들어오면 이미 있는 것과 충돌을 시도하라.

0개의 댓글