Computer Vision ์ ๋ฌด๋ฅผ ํ๋ค๋ณด๋ฉด 3D ๋ฐ์ดํฐ๋ ์์ฃผ ๋ค๋ฃจ๊ฒ ๋๋ค. ํ์ค ์ธ๊ณ๋ฅผ ๋์งํธ ๊ณต๊ฐ์ ์ฌํํ๋ ค๋ฉด 3D ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ํ์ฉํ๋ ๋ฐฉ์์ ๋ํ ์ดํด๊ฐ ํ์์ ์ด๋ค. ์ต๊ทผ์๋ ์์จ์ฃผํ, ๋ก๋ณดํฑ์ค, AR/VR, 3D ์ฌ๊ตฌ์ฑ, ์๋ฃ ๋ฑ ๋ค์ํ ๋ถ์ผ์์ 3D ๋ฐ์ดํฐ๊ฐ ํ์ฉ๋๊ณ ์๋ค.
3D ๋ฐ์ดํฐ๋ ์ ์ฅ ๋ฐฉ์์ ๋ฐ๋ผ Mesh, Point Cloud, Voxel ๋ฑ์ผ๋ก ๋๋ ์ ์๊ณ , ๊ฐ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ ์ฅํ๊ธฐ ์ํด PLY, PCD, OBJ ๊ฐ์ ๋ค์ํ ํ์ผ ํฌ๋งท์ด ์กด์ฌํ๋ค. ๊ฐ๊ฐ์ ํฌ๋งท์ ํน์ ํ ์ฉ๋์ ์ฅ์ ์ด ์๊ธฐ ๋๋ฌธ์, ํ๋ก์ ํธ์ ๋ชฉํ์ ๋ฐ๋ผ ์ ์ ํ ๋ฐ์ดํฐ๋ฅผ ์ ํํ๋ ๊ฒ์ด ์ค์ํ๋ค.
์ด ๊ธ์์๋ 3D ๋ฐ์ดํฐ์ ์ฃผ์ ๊ตฌ์กฐ์ ํฌ๋งท์ ์ ๋ฆฌํด ๋ณด๊ณ ์ ํ๋ค.
๐ 3D ๋ฐ์ดํฐ ๊ตฌ์กฐ
1. Mesh
๐ ํน์ง
- 3D ๊ณต๊ฐ์์ ์ ์ (Vertex)๊ณผ ๋ฉด(Face)์ ์ฐ๊ฒฐ์ ๊ธฐ๋ฐ์ผ๋ก ๋ชจ๋ธ์ ํํํ๋ค.
- ๋ฒ์ (Normal), ํ ์ค์ฒ(Texture), UV ์ขํ ๋ฑ์ ์ถ๊ฐ ์ ๋ณด๋ฅผ ํฌํจํ ์ ์๋ค.
- ๋ ๋๋ง, ๊ฒ์ ๊ทธ๋ํฝ, 3D ๋ชจ๋ธ๋ง์์ ๋ง์ด ์ฌ์ฉ๋๋ค.
๐ ๋ํ์ ์ธ ํ์ผ ํฌ๋งท
ํฌ๋งท | ํน์ง |
OBJ (+MTL) | ๊ฑฐ์ ๋ชจ๋ 3D ์ํํธ์จ์ด์์ ์ง์, ํ ์ค์ฒ ํฌํจ ๊ฐ๋ฅ |
FBX | Autodesk ํฌ๋งท, ์ ๋๋ฉ์ด์ ํฌํจ ๊ฐ๋ฅ |
GLTF/GLB | WebXR ๋ฐ AR/VR์์ ๋ง์ด ์ฌ์ฉ, ์์ถ๋ฅ ์ด ์ข์ |
STL | 3D ํ๋ฆฐํ ์ ๋ง์ด ์ฌ์ฉ, ํ ์ค์ฒ ์ ๋ณด ์์ |
PLY | ๋ฉ์์ ์ ๊ตฐ์ ์ ์ฅ ๊ฐ๋ฅ, ๋ค์ํ ์์ฑ ํฌํจ ๊ฐ๋ฅ |
2. Point Cloud
๐ ํน์ง
- 3D ๊ณต๊ฐ์์ ์ขํ(x, y, z)์ ์ปฌ๋ฌ(RGB, Intensity) ์ ๋ณด๋ฅผ ์ ์ฅํ๋ ๋ฐฉ์์ด๋ค.
- LiDAR ์ผ์, Structure from Motion(SfM), 3D ์ค์บ๋์์ ์์ฑ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
- ๋ฉ์๋ณด๋ค ๊ตฌ์กฐ๊ฐ ๋จ์ํ๊ณ ๋ฐ์ดํฐ๊ฐ ํฌ์ง๋ง, ๋ฅ๋ฌ๋๊ณผ 3D ๋ถ์์ ์ ๋ฆฌํ๋ค.
๐ ๋ํ์ ์ธ ํ์ผ ํฌ๋งท
ํฌ๋งท | ํน์ง |
PCD | PCL(Point Cloud Library)์์ ์ต์ ํ๋จ |
PLY | ์ปฌ๋ฌ ๋ฐ ๋ฒ์ ์ ๋ณด๋ฅผ ์ ์ฅํ ์ ์์ด ์ ๊ตฐ๊ณผ ๋ฉ์ ์ ์ฅ ๊ฐ๋ฅ |
LAS/LAZ | LiDAR ๋ฐ์ดํฐ ์ ์ฅ์ฉ (LAZ๋ ์์ถ ๋ฒ์ ) |
XYZ | ๋จ์ํ (x, y, z) ์ขํ ๋ฆฌ์คํธ, ์ปฌ๋ฌ ์ ๋ณด ์์ |
๐ 3D ๋ฐ์ดํฐ ๋ณํ: Mesh ↔ Point Cloud
3D ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๋ค ๋ณด๋ฉด Mesh์ Point Cloud ์ฌ์ด์ ๋ณํ์ด ์์ฃผ ํ์ํ๋ค. ๊ฐ ๋ฐ์ดํฐ ๊ตฌ์กฐ๊ฐ ๊ฐ์ง ํน์ฑ์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์, ๋ชฉ์ ์ ๋ง๊ฒ ๋ณํํ๋ฉด ๋์ฑ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ ์ ์๋ค.
ํฌ์ธํธ ํด๋ผ์ฐ๋๋ฅผ ๋ฉ์๋ก ๋ณํํ๋ ์ด์ ๋ ์ฃผ๋ก ๋ ๋๋ง๊ณผ 3D ๋ชจ๋ธ๋ง ๋๋ฌธ์ด๋ค. ํฌ์ธํธ ํด๋ผ์ฐ๋๋ ์ ๋ค์ ๋ชจ์์ด๋ผ ์ง์ ๋ ๋๋งํ๋ฉด ๋น์ด ๋ณด์ผ ์ ์๋ค. ๋ฐ๋ผ์ Triangulation ๊ณผ์ ์ ํตํด ์ ๋ค์ ์ฐ๊ฒฐํด ๋ฉด(Face)์ ํ์ฑํ๋ฉด, ๊ฒ์, AR/VR, 3D ํ๋ฆฐํ ๋ฑ์ ์์ฉ์์ ๋ ์ ์ ํ๊ฒ ์ฌ์ฉํ ์ ์๋ค. ์ด ๊ณผ์ ์์๋ Poisson Surface Reconstruction์ด๋ Ball Pivoting Algorithm๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ด ์ฃผ๋ก ์ฌ์ฉ๋๋ฉฐ, MeshLab์์๋ `Surface Reconstruction` ๊ธฐ๋ฅ์ ์ด์ฉํด ์ฝ๊ฒ ๋ณํํ ์ ์๋ค. ๋ํ, CloudCompare์์๋ `Poisson Reconstruction`์ ํ์ฉํด ํฌ์ธํธ ํด๋ผ์ฐ๋๋ฅผ ๋ฉ์๋ก ๋ณํํ ์ ์๋ค.
๋ฐ๋๋ก, ๋ฉ์๋ฅผ ํฌ์ธํธ ํด๋ผ์ฐ๋๋ก ๋ณํํ๋ ์ด์ ๋ ์ฃผ๋ก 3D ๋ฅ๋ฌ๋๊ณผ LiDAR ์๋ฎฌ๋ ์ด์ ๋๋ฌธ์ด๋ค. ๋ฉ์ ๋ฐ์ดํฐ๋ ๋ฉด์ผ๋ก ์ด๋ฃจ์ด์ ธ ์์ง๋ง, ๋ฅ๋ฌ๋ ๋ชจ๋ธ(PointNet ๋ฑ)์ ๋ฉ์๋ณด๋ค ํฌ์ธํธ ํด๋ผ์ฐ๋๋ฅผ ์ ๋ ฅ์ผ๋ก ์ฌ์ฉํ๋ค. ๋ฐ๋ผ์ ๋ฉ์ ํ๋ฉด์์ ์ผ์ ํ ๊ฐ๊ฒฉ์ผ๋ก ์ ์ ์ํ๋งํ๋ ๋ฐฉ์์ ์ฌ์ฉํด ํฌ์ธํธ ํด๋ผ์ฐ๋๋ก ๋ณํํ๋ค. ์ด๋ฅผ ์ํด Uniform Sampling์ด๋ Poisson Disk Sampling๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ด ์ฌ์ฉ๋๋ฉฐ, MeshLab์์๋ `Poisson-disk Sampling` ๊ธฐ๋ฅ์ ์ด์ฉํด ๋ฉ์๋ฅผ ํฌ์ธํธ ํด๋ผ์ฐ๋๋ก ๋ณํํ ์ ์๋ค. CloudCompare์์๋ `Mesh to Cloud` ๊ธฐ๋ฅ์ ํตํด ๋ฉ์๋ฅผ ํฌ์ธํธ ํด๋ผ์ฐ๋๋ก ๋ณํํ ์ ์๋ค.
์ด๋ฌํ ๋ณํ ๊ณผ์ ์ CG, AR/VR, ์์จ์ฃผํ, 3D ํ๋ฆฐํ , ์ธ๊ณต์ง๋ฅ ์ฐ๊ตฌ ๋ฑ ๋ค์ํ ๊ณณ์์ ํ์์ ์ผ๋ก ํ์ฉ๋๋ค. ๋ฐ๋ผ์ ์ด๋ค ๋ฐ์ดํฐ ๊ตฌ์กฐ๊ฐ ํ์ํ์ง์ ๋ฐ๋ผ ๋ณํ์ด ํ์ํ๋ค๋ ์ ์ ์ดํดํ๋ ๊ฒ์ด ์ค์ํ๋ค.
3. Voxel
๐ ํน์ง
- 3D ๊ณต๊ฐ์ Voxel(3D ํฝ์ ) ๋จ์๋ก ํํํ๋ ๋ฐฉ์์ด๋ค.
- CT, MRI ๊ฐ์ ์๋ฃ ์์ ๋ฐ์ดํฐ๋ 3D ๋ฅ๋ฌ๋ ์ฐ๊ตฌ์์ ๋ง์ด ์ฌ์ฉ๋๋ค.
- ๋ฉ์๋ ์ ๊ตฐ๊ณผ ๋ฌ๋ฆฌ ๋ด๋ถ ๊ตฌ์กฐ๊น์ง ํํํ ์ ์๋ค.
๐ ๋ํ์ ์ธ ํ์ผ ํฌ๋งท
ํฌ๋งท | ํน์ง |
VDB (OpenVDB) | Sparse Voxel ์ ์ฅ, CG ๋ฐ ์๋ฎฌ๋ ์ด์ ์์ ์ฌ์ฉ |
NII (NIfTI) | ์๋ฃ ์์ (MRI, CT) ๋ฐ์ดํฐ ํฌ๋งท |
MRC | Cryo-EM ๋ฐ์ดํฐ์ ์ฌ์ฉ |
๐ 3D ๋ฐ์ดํฐ ํฌ๋งท
1. PLY (Polygon File Format, Stanford PLY)
๐ ํน์ง
- Point Cloud์ Mesh ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ ์๋ค.
- ASCII ๋ฐ ๋ฐ์ด๋๋ฆฌ ํ์์ ๋ชจ๋ ์ง์ํ์ง๋ง, ์ผ๋ฐ์ ์ผ๋ก ๋ฐ์ด๋๋ฆฌ ํํ๋ฅผ ์ฌ์ฉ.
- ๊ฐ ์ ๋ง๋ค RGB ์ปฌ๋ฌ, ๋ฒ์ (normal), ํฌ๋ช ๋(alpha), ๋ฐ์ฌ์จ ๋ฑ ๋ค์ํ ์์ฑ์ ์ ์ฅํ ์ ์๋ค.
๐ ์ฃผ๋ก ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
- ์ ๊ตฐ(Point Cloud) ๋ฐ์ดํฐ ์ ์ฅ
- 3D Reconstruction ๊ฒฐ๊ณผ ์ ์ฅ
- Open3D, MeshLab ๋ฑ์ ํด์์ ์ฌ์ฉ
*๋ฐ์ด๋๋ฆฌ๋ ํ์ผ ํฌ๊ธฐ๋ฅผ ์ค์ด๊ณ ์ฒ๋ฆฌ ์๋๋ฅผ ๋์ด๋๋ฐ ์ ๋ฆฌํ๋ค.
์ ์์์ฒ๋ผ ply ํฌ๋งท ํ์ผ์ ํ ์คํธ ํธ์ง๊ธฐ๋ก ๋ณด๋ฉด end_header ์๋๋ก๋ ๋ฐ์ด๋๋ฆฌ๋ผ์ ์์ ๋ณผ ์ ์์
→ ๋๋ฌธ์ ์๋ ์ฝ๋์ ๊ฐ์ด open3d๋ฅผ ์ด์ฉํด์ ํ์ผ์ ์ฝ๊ณ ํ๋ก์ธ์ฑํ๋ฉด ๋จ
import open3d as o3d
import numpy as np
# ํ์ผ ๊ฒฝ๋ก ์ง์
file_path = 'scans/scene0000_00/scene0000_00_vh_clean_2.ply'
# 1. ํฌ์ธํธ ํด๋ผ์ฐ๋๋ก ์ฝ๊ธฐ
print("=== ํฌ์ธํธ ํด๋ผ์ฐ๋ ์ ๋ณด ===")
pcd = o3d.io.read_point_cloud(file_path)
points = np.asarray(pcd.points)
# ํฌ์ธํธ ํด๋ผ์ฐ๋ ๊ธฐ๋ณธ ํน์ฑ
print(f"ํฌ์ธํธ ์: {len(pcd.points)}")
print(f"ํฌ์ธํธ ์ฐจ์: {np.asarray(pcd.points).shape}")
print(f"์ปฌ๋ฌ ๋ฐ์ดํฐ ์กด์ฌ ์ฌ๋ถ: {pcd.has_colors()}")
if pcd.has_colors():
print(f"์ปฌ๋ฌ ๋ฐ์ดํฐ shape: {np.asarray(pcd.colors).shape}")
print(f"๋
ธ๋ฉ ๋ฒกํฐ ์กด์ฌ ์ฌ๋ถ: {pcd.has_normals()}")
if pcd.has_normals():
print(f"๋
ธ๋ฉ ๋ฒกํฐ shape: {np.asarray(pcd.normals).shape}")
# 2. ๋ฉ์๋ก ์ฝ๊ธฐ
print("\n=== ๋ฉ์ ์ ๋ณด ===")
mesh = o3d.io.read_triangle_mesh(file_path)
# ๋ฉ์ ๊ธฐ๋ณธ ํน์ฑ
print(f"์ ์ ์: {len(mesh.vertices)}")
print(f"์ผ๊ฐํ ๋ฉด ์: {len(mesh.triangles)}")
print(f"์ ์ ๋
ธ๋ฉ ์กด์ฌ ์ฌ๋ถ: {mesh.has_vertex_normals()}")
print(f"์ ์ ์ปฌ๋ฌ ์กด์ฌ ์ฌ๋ถ: {mesh.has_vertex_colors()}")
print(f"์ผ๊ฐํ ๋
ธ๋ฉ ์กด์ฌ ์ฌ๋ถ: {mesh.has_triangle_normals()}")
# 3. ์๊ฐํ (ํ์ํ ๊ฒฝ์ฐ)
o3d.visualization.draw_geometries([pcd]) # ํฌ์ธํธ ํด๋ผ์ฐ๋ ์๊ฐํ
o3d.visualization.draw_geometries([mesh]) # ๋ฉ์ ์๊ฐํ
- ply ํ์ผ์ point cloud ๋๋ mesh ๊ตฌ์กฐ๋ก ์ฝ์ ์ ์์
- point cloud๋ points, colors, normals์ ๊ฐ์ ๊ฐ๋ค์ด ์กด์ฌ
- mesh๋ vertices, triangles, vertex_colors์ ๊ฐ์ ๊ฐ๋ค์ด ์กด์ฌ
- ์๊ฐํ ๊ฒฐ๊ณผ๋ ์์ ๊ฐ๊ณ , point cloud๋ ๊ฐ ํฌ์ธํธ์ ์ปฌ๋ฌ๊ฐ์ ํํํ๊ณ
- mesh๋ vertex color๋ฅผ ๊ธฐ๋ฐ์ผ๋ก triangle ์์ interpolation ํด์ ํํํ๋ค๊ณ ํ๋ค.
2. PCD (Point Cloud Data)
๐ ํน์ง
- Point Cloud Library (PCL)์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉํ๋ Point cloud ๋ฐ์ดํฐ ํฌ๋งท์ด๋ค.
- ASCII, ๋ฐ์ด๋๋ฆฌ, ์์ถ ๋ฐ์ด๋๋ฆฌ ํ์์ ์ง์
- XYZ ์ขํ, RGB, ๋ฒ์ , ๋ฐ์ฌ์จ ๋ฑ์ ์ ๋ณด๋ฅผ ์ ์ฅํ ์ ์๋ค.
๐ ์ฃผ๋ก ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
- PCL์ ์ฌ์ฉํ ๋ (ํฌ์ธํธ ํด๋ผ์ฐ๋ ํํฐ๋ง, ์ ๋ ฌ, ๋ถํ ๋ฑ)
- LiDAR ์ค์บ ๋ฐ์ดํฐ ์ ์ฅ ๋ฐ ์ฒ๋ฆฌ
3. OBJ (+ MTL)
๐ ํน์ง
- 3D Mesh ๋ฐ์ดํฐ ์ ์ฅ์ ๊ฐ์ฅ ๋๋ฆฌ ์ฐ์ด๋ ํฌ๋งท์ด๋ค.
- ์ ์ (Vertex), ๋ฉด(Face), ๋ฒ์ (Normal), UV ๋งต(Texture Coordinates) ๋ฑ์ ์ ๋ณด๋ฅผ ์ ์ฅํ ์ ์๋ค.
- ํ ์ค์ฒ(Texture) ์ ๋ณด๋ ๋ณ๋์ `.mtl` (Material Library) ํ์ผ์ ์ ์ฅ๋๋ค.
๐ ์ฃผ๋ก ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
- 3D ๋ชจ๋ธ ์ ์ฅ (AR/VR, ๊ฒ์, 3D ํ๋ฆฐํ ๋ฑ)
- ๋ฉ์ ๊ธฐ๋ฐ ๋ฐ์ดํฐ ๋ถ์ (๋ฅ๋ฌ๋, ๋ ๋๋ง ๋ฑ)
mtllib f9c955b7467aea60bb17e584a89c7b57_obj0_object.mtl
v -0.41838332895 -0.100635208392 0.0562479311505
v -0.359337028451 -0.100635208392 0.0442104636768
...
vt -5.0965 1.0390
vt -0.0000 -0.0000
...
usemtl Color_003
f 1/1 2/2 3/3
f 2/2 1/1 4/4
...
์์ | ์ค๋ช | ๋ํ ์ผ | ์์ |
v | 3D Vertex ์ขํ | v x y z ํ์์ผ๋ก, 3D ๊ณต๊ฐ์์ ์ ์ (Vertex)์ ์ขํ๋ฅผ ์ ์ | v -0.418 -0.100 0.056 |
vt | ํ ์ค์ฒ ์ขํ | vt u v ํ์์ผ๋ก, 3D ๋ชจ๋ธ์ ์ ์ฉ๋ 2D ํ ์ค์ฒ UV Mapping๋ฅผ ์ ์ | vt -5.0965 1.0390 |
f | face ์ ์ | f a/b c/d e/f ํ์์ผ๋ก,3D ๋ชจ๋ธ์ ๋ฉด(Face)์ ์ ์ a → Vertex) ์ธ๋ฑ์ค (v์์ ์ ์ํ ๋ฒํธ) b → ํ ์ค์ฒ ์ขํ ์ธ๋ฑ์ค (vt์์ ์ ์ํ ๋ฒํธ) |
f 1/1 2/2 3/3 |
usemtl | ์ฌ์ฉํ ๋จธํฐ๋ฆฌ์ผ ์ค์ | usemtl Color_003 |
- OBJ ํ์ผ์ ์ฌ๋์ด ์ฝ์ ์ ์๋ ํ์์ผ๋ก ์ ์ฅ
- 3D ๋ชจ๋ธ์ ํํํ๊ธฐ ์ํด Vertex, ํ ์ค์ฒ ์ขํ, Face ์ ๋ณด๋ฅผ ํฌํจ
- .mtl ํ์ผ๊ณผ ํจ๊ป ์ฌ์ฉํ๋ฉด ๋จธํฐ๋ฆฌ์ผ ๋ฐ ํ ์ค์ฒ ์ ๋ณด๋ฅผ ์ถ๊ฐํ ์ ์๋ค.