Plane Detector
1 개요
Normal 정보가 있는 포인트 클라우드 또는 mesh 에서 평면을 검출하는 알고리즘
2 알고리즘 상세 설명
| Source Object | Destination Object |
|---|---|
![]() |
![]() |
Normal 정보가 있는 point cloud 또는 mesh 에 대하여 지원하며, Plane Fitting Target 을 Vertex Normal 또는 Face 로 지정할 수 있습니다.
normal vector resolution 에 기반하여 클러스터링 된 각 그룹 내에서 Plane 은 다음의 단계들을 거칩니다.
- Outliers Filtering(optional)
- Plane Fitting
- Plane Expansion
- Plane Merging
Outliers Filtering 단계에서는 지정된 Outliers Filtering Method 를 사용하여 평면을 정하고 해당 평면에 대한 outlier 를 규정 및 일시적 비활성화 합니다. 비활성화의 해제는 Plane Fitting 에서 평면 추정 이후 발생합니다. 이 단계는 Outliers Threshold Count = 0 으로 설정함으로써 생략될 수 있습니다.
Plane Fitting 단계에서는 non-outlier 를 대상으로 Plane Fitting Method 를 수행합니다. 일단 평면이 정해진 이후에는, 평가 시 outlier 를 해제한 상태에서 수행됩니다. 평가에 통과하지 못한 평면은 무효화 됩니다.
Plane Expansion 단계에서는 통과한 평면에 모든 inlier 점들을 삽입하며, 그룹과 무관하게 이루어집니다.
Plane Merging 단계는 최종적으로 1회만 수행되며, 유사하고 centroid 수직 거리가 가까운 평면들에 대하여 병합됩니다. 이 과정으로 인하여 일부 평면은 inlier distance 를 초과하는 원소를 가질 수 있습니다.
3 파라미터 설정 및 사용 방법
기본 파라미터 설정
const CResult SetPlaneFittingTarget(EPlaneFittingTarget ePlaneFittingTarget)
Plane fitting target 을 설정합니다.eOptimizationOption: 최적화 옵션
Default: EPlaneFittingTarget_VertexNormal- EPlaneFittingTarget_VertexNormal: Vertex positions 와 vertex normals 을 사용해 평면을 피팅합니다.
- EPlaneFittingTarget_Face: Face centroids 와 face normals 을 사용해 평면을 피팅합니다.
const CResult SetMaximumParallelPlaneCount(int64_t i64MaximumParallelPlaneCount)
Maximum parallel plane count 를 설정합니다. 동일한 normal group 내에서 검출 될 수 있는 평면의 최대 수를 의미합니다.i64MaximumParallelPlaneCount: 최대 평행 평면 수
Default: 1, [1, 100]
const CResult SetNormalVectorResolution(const Base::TPoint3<int32_t> tpNormalVectorResolution)
Normal vector resolution 을 설정합니다. Normal vector 와 원점을 중심으로 한 정육면체 표면 간 교차점을 기반으로 클러스터가 형성됩니다.tpNormalVectorResolution: Normal vector resolution
Default: {3, 3, 3}, 각 [1, 100]
const CResult SetInlierDistance(double f64InlierDistance)
평면으로부터의 거리가 이 값 이하인 Target point 가 포함됩니다. 하지만, plane merge 과정으로 인하여 해당 거리보다 먼 점들이 포함될 수 있습니다.f64InlierDistance: Inlier distance
Default: 0.00
const CResult SetMinimumInlierCount(int64_t i64MinimumInlierCount)
Minimum inlier count 를 설정합니다. Plane Fitting Target Vertex Normal 에서, 확장되지 않은 평면이 해당 조건을 만족하지 않으면 제거됩니다.i64MinimumInlierCount: Minimum inlier count
Default: 100, [3, ..)
const CResult SetMinimumInlierArea(double f64MinimumInlierArea)
Minimum inlier area 를 설정합니다. Plane Fitting Target Face 모드에서, 확장되지 않은 평면이 해당 조건을 만족하지 않으면 제거됩니다.f64MinimumInlierArea: Minimum inlier area
Default: 0.00, [0.00, ..)
const CResult SetFitCosineSimilarity(double f64FitCosineSimilarity)
Fit cosine similarity 를 설정합니다. 동일 클러스터 내에서 plane fitting 도중 point normal 과 plane normal 간 최대 허용 각도의 cosine 값입니다. Point 의 unit normal 과 plane 의 unit normal 간 내적이 이 threshold 값 보다 크거나 같으면 해당 점은 포함됩니다.f64FitCosineSimilarity: Fit cosine similarity
Default: 0.995, [0.00, 1.00]
const CResult SetExpandCosineSimilarity(double f64ExpandCosineSimilarity)
Expand cosine similarity 를 설정합니다. 서로 다른 클러스터 내에서 plane expansion 도중 point normal 과 plane normal 간 최대 허용 각도의 cosine 값입니다. Point 의 unit normal 과 plane 의 unit normal 간 내적이 이 threshold 값 보다 크거나 같으면 해당 점은 포함됩니다.f64ExpandCosineSimilarity: Expand cosine similarity
Default: 0.99, [0.00, 1.00]
const CResult SetMergeCosineSimilarity(double f64MergeCosineSimilarity)
Merge cosine similarity 를 설정합니다. plane merging 도중 plane normal 간 최대 허용 각도의 cosine 값입니다. plane 간의 unit normal 내적이 이 threshold 값 보다 크거나 같으면 해당 plane 은 병합됩니다.f64MergeCosineSimilarity: Merge cosine similarity
Default: 0.99, [0.00, 1.00]
Outliers Filtering 파라미터 설정
const CResult SetOutliersFilteringMethod(EOutliersFilteringMethod eOutliersFilteringMethod)
Outliers filtering method 를 설정합니다.eOutliersFilteringMethod: Outliers filtering method
Default: EOutliersFilteringMethod_LeastSquare- EOutliersFilteringMethod_LeastSquare: Least Square 를 사용한 종속 반복적 plane fitting 방식이 outlier 제거에 사용됩니다. 평면으로부터 (Mean Absolute Distance * Outliers Threshold) 보다 멀리 떨어진 점들이 일시적으로 비활성화 됩니다.
- EOutliersFilteringMethod_RANSAC1P: 1-point RANSAC 를 사용한 독립 반복적 plane fitting 방식이 outlier 제거에 사용됩니다. 최적 평면으로부터 (Inlier Distance * Outliers Threshold) 보다 멀리 떨어진 점들이 일시적으로 비활성화 됩니다.
const CResult SetOutliersThresholdCount(int64_t i64OutliersThresholdCount)
Outliers threshold count 를 설정합니다. Outliers Filtering Method 의 반복 횟수를 지정합니다. 0 으로 설정된 경우, outlier filtering 이 생략됩니다.i64OutliersThresholdCount: Outliers threshold count
Default: 0, [0, 1000]
const CResult SetOutliersThreshold(double f64OutliersThreshold)
Outliers threshold 를 설정합니다. Outliers Filtering Method 에서 사용되는 기준 거리에 적용될 계수.f64OutliersThreshold: Outliers threshold
Default: 3.00, [0, ..)
Plane Fitting 파라미터 설정
const CResult SetPlaneFittingMethod(EPlaneFittingMethod ePlaneFittingMethod)
Plane fitting method 를 설정합니다.ePlaneFittingMethod: Plane fitting method
Default: EPlaneFittingMethod_LeastSquare- EPlaneFittingMethod_LeastSquare: Least Square 가 plane fitting 에 사용됩니다.
- EPlaneFittingMethod_RANSAC3P: 독립 반복적 3-point RANSAC 이 plane fitting 에 사용됩니다.
const CResult SetPlaneFittingCount(int64_t i64PlaneFittingCount)
Plane fitting count 를 설정합니다. 3-Point RANSAC 의 반복 횟수를 의미합니다.i64PlaneFittingCount: Plane fitting count
Default: 100, [0, 1000]
Result
int32_t GetResultPlaneCount()
Result plane count 를 가져옵니다.const CResult GetResultPlaneTargetCounts(Base::CFLArray<int32_t>* pFlaResultPlaneTargetCounts)
Result plane target counts 를 가져옵니다.const CResult GetResultPlaneAreas(Base::CFLArray<float>* pFlaResultPlaneAreas)
Result plane area 를 가져옵니다. Fitting target face 에서 0 이 아닌 값을 반환합니다.const CResult GetResultPlaneCentroids(Base::CFLArray<Base::TPoint3<float>>* pFlaResultPlaneCentroids)
Result plane centroids 를 가져옵니다.const CResult GetResultPlaneNormals(Base::CFLArray<Base::TPoint3<float>>* pFlaResultPlaneNormals)
Result plane normals 를 가져옵니다.const CResult GetResultPlaneVertices(Base::CFLArray<Base::CFLArray<Base::TPoint3<float>>>* pFlaResultPlaneVertices)
Result plane vertices 를 가져옵니다.const CResult GetResultPlaneVertexNormals(Base::CFLArray<Base::CFLArray<Base::TPoint3<float>>>* pFlaResultPlaneVertexNormals)
Result plane vertex normals 를 가져옵니다.const CResult GetResultPlaneFaceIndices(Base::CFLArray<Base::CFLArray<int32_t>>* pFlaResultPlaneFaceIndices)
Result plane face indices 를 가져옵니다. Fitting target face 에서 데이터를 반환합니다.
4 예제 코드
CPlaneDetector3D planeDetector3D;
planeDetector3D.SetSourceObject(floSrcObject)
planeDetector3D.SetDestinationObject(floDstObject)
planeDetector3D.SetPlaneFittingTarget(CPlaneDetector3D::EPlaneFittingTarget_VertexNormal)
planeDetector3D.SetMaximumParallelPlaneCount(1)
planeDetector3D.SetNormalVectorResolution(Base::TPoint3<int32_t>(19, 19, 19))
planeDetector3D.SetInlierDistance(0.5)
planeDetector3D.SetMinimumInlierCount(500)
planeDetector3D.SetFitCosineSimilarity(0.995)
planeDetector3D.SetExpandCosineSimilarity(0.99)
planeDetector3D.SetMergeCosineSimilarity(0.99)
planeDetector3D.SetOutliersFilteringMethod(CPlaneDetector3D::EOutliersFilteringMethod_LeastSquare)
planeDetector3D.SetOutliersThresholdCount(1)
planeDetector3D.SetOutliersThreshold(3.00)
planeDetector3D.SetPlaneFittingMethod(CPlaneDetector3D::EPlaneFittingMethod_LeastSquare)
planeDetector3D.Execute()
5 기타 사항
Supported Feature
- 3D Object
- Source 3D Object
- Destination 3D Object
Supported Format
- Source
[in]- normal-equipped point cloud / mesh

