Vertex Normal Estimation

Normal Vector란?

3D 포인트 클라우드 표면의 방향을 나타내는 벡터. 표면 재구성, 특징 추출 등에 필수적.

포인트 클라우드는 단순 점의 집합. 표면의 방향 정보가 없으면 3D 형태를 제대로 이해/처리할 수 없음. → Normal vector로 각 점에서 표면이 어느 방향을 향하는지 계산

코드 예제

import open3d as o3d

ply_point_cloud = o3d.data.PLYPointCloud()
pcd = o3d.io.read_point_cloud(ply_point_cloud.path)

print("downsample the point cloud with a voxel of 0.05")
downpcd = pcd.voxel_down_sample(voxel_size=0.05) 

#####################################################

print("Recompute the normal of the downsampled point cloud")
downpcd.estimate_normals(
    search_param=o3d.geometry.KDTreeSearchParamHybrid(radius=0.1, max_nn=30)
)

o3d.visualization.draw_geometries(
    [downpcd],
    zoom=0.3412,
    front=[0.4257, -0.2125, -0.8795],
    lookat=[2.6172, 2.0475, 1.532],
    up=[-0.0694, -0.9768, 0.2024],
    point_show_normal=True
)

image.png

파라미터

KDTreeSearchParamHybrid(radius, max_nn)

선택 가이드

보너스: Normal 방향 통일

python

downpcd.orient_normals_consistent_tangent_plane(k=15)

법선 방향이 제각각일 때 일관되게 정렬.