새소식

Point Cloud

바닥을 찾아보자 - Plane Segmentation

  • -

사실 Point Cloud 의 포인트들은 다 연결되어 있습니다. 모든 물체가 바닥에 붙어 있기 때문입니다. 

따라서 DBSCAN 을 적용하면 모두 연결되어 있기 때문에 다음과 같이 하나의 클러스터가 나옵니다. 

좌 : 원본  / 우 : DBSCAN 결과

따라서 바닥을 찾아서 없앨 필요가 있습니다. 바닥을 찾는 것을 Plane Segmentation 이라고 합니다. 

이때 많이 사용하는 방식이 RANSAC 입니다. 

RANSAC 은 우선 샘플을 뽑고, 해당 조건을 가장 많이 만족하는 파라미터를 찾는 것입니다. 하지만 Plane Segmentation 에서 RANSAC 을 쓰는 경우에는 "1) 바닥은 하나 뿐이고 , 2) 바닥면이 가장 크다" 라는 가정을 전제로 하고 있습니다. 

예를 들어, RANSAC 을 사용할 때는 벽면이 더 클 경우 벽면을 바닥이라고 판단하게 되는 문제가 발생합니다. 

 

따라서 RANSAC 을 쓸 때는 추출한 평면의 법선 벡터를 고려하는 등 추가적인 조건을 더 고려해 주어야 합니다. 

Plane Segmentation Code using Open3D : segment_plane

Open3D 에서는 Plane Segmentation 을 위한 메소드를 제공합니다. 

 

http://www.open3d.org/docs/latest/tutorial/Basic/pointcloud.html

 

Point Cloud — Open3D latest (664eff5) documentation

This tutorial demonstrates basic usage of a point cloud. Paint point cloud print("Paint chair") chair.paint_uniform_color([1, 0.706, 0]) o3d.visualization.draw_geometries([chair], zoom=0.7, front=[0.5439, -0.2333, -0.8060], lookat=[2.4615, 2.1331, 1.338],

www.open3d.org

 

#read_point_cloud 먼저 수행
#필요한 경우 voxel downsampling 수행

plane_model, inliers = pcd_down.segment_plane(distance_threshold = 0.02, ransac_n = 3, num_iteration=1000)

[a,b,c,d] = plane_model

inlier_cloud = pcd_down.select_by_index(inliers)
inlier_cloud.paint_uniform_color([1.0, 0, 0])
outlier_cloud = pcd_down.select_by_index(inliers, invert = True)
  • distance_threshold : plane 을 설정했을 때, 해당 plane에 속하는지 / 안 속하는지를 판단하는 기준. 여기서는 2cm 를 기준으로 했습니다. 
  • ransac_n : 점 n개로 plane 을 정의 

따라서 해당 코드를 실행하면 다음과 같이 바닥을 cluster 하게 됩니다. 

 


위 내용은 경희대학교 소프트웨어융합학과 황효석 교수님의 2023년 <3D데이터처리> 수업 내용을 요약한 것입니다.

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.