point clouds 로부터, 평면의 방정식 도출하기

FSA·2024년 8월 22일

1. 개요

  • Open3D는 RANSAC을 사용하여 포인트 클라우드에서 기하학적 기본 형상을 분할하는 기능을 지원
  • 포인트 클라우드에서 가장 많은 지지를 받는 평면을 찾기 위해, segment_plane 함수를 사용할 수 있습니다.
  • segment_plane 함수의 return 값
    • 이 함수는 평면을 (𝑎,𝑏,𝑐,𝑑)로 반환하며,
      • 각 점 (𝑥,𝑦,𝑧)에 대해 𝑎𝑥+𝑏𝑦+𝑐𝑧+𝑑=0이 성립합니다.
    • 인라이어 점들의 인덱스 리스트도 반환
  • 이 메서드는 세 가지 인자를 받습니다:
    • distance_threshold는 추정된 평면에서 어느 점이 인라이어로 간주될 수 있는 최대 거리를 정의하며, ransac_n은 평면을 추정하기 위해 임의로 샘플링되는 점의 수를 정의하고, num_iterations는 임의의 평면이 샘플링되고 검증되는 횟수를 정의합니다.
pcd = o3d.io.read_point_cloud("../../test_data/fragment.pcd")
plane_model, inliers = pcd.segment_plane(distance_threshold=0.01,
                                         ransac_n=3,
                                         num_iterations=1000)
[a, b, c, d] = plane_model
print(f"Plane equation: {a:.2f}x + {b:.2f}y + {c:.2f}z + {d:.2f} = 0")

inlier_cloud = pcd.select_by_index(inliers)
inlier_cloud.paint_uniform_color([1.0, 0, 0])
outlier_cloud = pcd.select_by_index(inliers, invert=True)
o3d.visualization.draw_geometries([inlier_cloud, outlier_cloud],
                                  zoom=0.8,
                                  front=[-0.4999, -0.1659, -0.8499],
                                  lookat=[2.1813, 2.0619, 2.0999],
                                  up=[0.1204, -0.9852, 0.1215])
  • 위 코드의 실행 결과, 다음과 같은 평면 방정식을 얻을 수 있습니다:

1.1. segment_plane 함수 파라미터 설명

1. 요약

  • distance_threshold: 평면에서 떨어진 거리 기준으로 점이 평면에 속하는지(인라이어) 판단하는 임계값.
  • ransac_n: 평면을 추정하기 위해 임의로 샘플링하는 점의 수.
  • num_iterations: 최적의 평면을 찾기 위해 반복되는 시도의 횟수.

2. distance_threshold

개념:

  • distance_threshold는 평면에서 떨어진 거리 기준으로 포인트를 인라이어(inlier)로 판단하는 기준
  • 이 값이 작을수록 평면에 가까운 점들만 인라이어로 간주되고, 값이 클수록 더 먼 점들도 평면에 속한다고 간주됩니다.
  • distance_threshold를 너무 작게 설정하면 실제로 평면에 속하는 점들도 아웃라이어로 분류될 수 있습니다. 반면, 너무 크게 설정하면 평면에 속하지 않는 점들도 인라이어로 잘못 분류될 수 있습니다.

3. ransac_n

개념:

  • ransac_n은 평면을 추정하기 위해 임의로 샘플링하는 포인트의 개수
  • RANSAC 알고리즘은
    • 임의의 포인트들을 샘플링하여 이들로부터 평면을 추정하고, 이 평면에 얼마나 많은 점들이 적합한지(즉, 인라이어로 분류되는지)를 확인

예시:

  • ransac_n이 3으로 설정되면, 매번 3개의 점을 임의로 선택하여 이 점들이 이루는 평면을 추정합니다.
    • 그 후, 이 추정된 평면이 포인트 클라우드에서 얼마나 많은 점들을 인라이어로 포함하는지 검사합니다.
  • ransac_n이 너무 작으면, 평면 추정의 신뢰도가 낮아질 수 있습니다. 반면, 너무 크면 계산 비용이 증가하여 효율성이 떨어질 수 있습니다.

4. num_iterations

개념:

  • num_iterations는 RANSAC 알고리즘이 반복적으로 샘플링을 시도하는 횟수
  • RANSAC은 반복적으로 샘플을 추출하여 최적의 평면을 찾으려고 합니다.
    • num_iterations이 클수록 더 다양한 샘플이 시도되고, 더 정확한 평면을 찾을 가능성이 높아집니다.

예시:

  • num_iterations이 1000으로 설정되었다면, RANSAC 알고리즘은 1000번의 시도를 통해 최적의 평면을 찾으려고 시도합니다.
  • 반복 횟수가 너무 적으면 최적의 평면을 찾지 못할 가능성이 높아집니다.
    • 그러나 너무 많은 반복은 계산 시간을 증가시키므로 적절한 값을 설정하는 것이 중요합니다.
profile
모든 의사 결정 과정을 지나칠 정도로 모두 기록하고, 나중에 스스로 피드백 하는 것

0개의 댓글