사실 Point Cloud 의 포인트들은 다 연결되어 있습니다. 모든 물체가 바닥에 붙어 있기 때문입니다.
따라서 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
#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데이터처리> 수업 내용을 요약한 것입니다.