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데이터처리> 수업 내용을 요약한 것입니다. 공유하기 URL 복사카카오톡 공유페이스북 공유엑스 공유 게시글 관리 구독하기everyday robotics 저작자표시 Contents PlaneSegmentationCodeusingOpen3D:segment_plane 당신이 좋아할만한 콘텐츠 Point Cloud 를 동심원 모양으로 분할하기 (Python) 2023.07.31 Point Cloud Descriptor (2) : FPFH, 3DSC, SHOT, NARF 2023.07.18 Point Cloud Descriptor (1) : PFH 2023.07.15 Point Cloud 를 군집화해보자 - Clustering : K-means, DBSCAN 2023.07.06 댓글 0 + 이전 댓글 더보기