Surface Reconstruction 3D
1 개요
주어진 포인트 클라우드의 표면을 재구성하는 알고리즘입니다.
2 알고리즘 상세 설명
Source | Destination |
---|---|
![]() |
![]() |
![]() |
![]() |
원본의 변화 없이 표면을 재구성할 수 있는 명시적 표면 재구성 방법(Explicit)과, 닫힌 표면에 한정하여 표면을 추정하는 암시적 표면 재구성 방법(Implicit)을 지원합니다. 명시적 표면은 두 가지 방법으로 나뉩니다.
-
Explicit Region Growing : 메모리 사용량이 Explicit Sculpture에 비해 상대적으로 적습니다. 3D Object가 법선 벡터를 포함해야 하며 없을 경우 내부적으로 계산됩니다. 복잡한 표면의 경우 법선 벡터가 포함되어 있지 않다면 높은 정확도를 기대하기 어렵습니다. 대부분의 입력 데이터에서 Explicit Sculpture 방법 보다 낮은 결과 정확도를 보입니다.
-
Explicit Sculpture : 법선 벡터가 필요하지 않으며, 3D Delaunay Triangulation의 사면체 집합에서 표면에 가장 가까운 삼각형 집합을 추정합니다. 메모리 사용량이 크고 계산량이 많아 높은 성능을 기대하기 어렵습니다. Explicit Region Growing 방법과 비교하였을 때 상대적으로 높은 정확도를 보입니다.
-
Implicit : 3D Object가 법선 벡터를 포함하며, 데이터가 닫힌 표면을 형성해야 더 좋은 결과를 얻을 수 있습니다. 법선 벡터가 포함되어 있지 않다면 내부적으로 계산되어 사용되나, Interior/Exterior의 구분이 모호해질 수 있는 문제가 있어 정확한 결과를 얻을 가능성이 낮습니다.
3 파라미터 설정 및 사용 방법
Explicit/Implicit 공통 파라미터
0.007 | 0.009 | 0.01 | ![]() |
![]() |
![]() |
---|
-
EnableSamplingPointCloud(bool bSampling)
- Default Value : false
- true : 샘플링을 적용합니다.
-
SetSamplingDistance(float f32SamplingDistance)
- f32SamplingDistance : Voxel Grid 샘플링 거리
- Default Value : 0.03
- Recommended Value : 0.005 ~ 0.1
Source Object의 Point Cloud 수가 10만 개 이상으로 큰 데이터의 경우 오랜 시간이 소요될 수 있습니다. 이러한 데이터는 대부분 밀도가 높을 가능성이 있으며, Sampling 결과로 표면 재구성을 해도 유사한 표면을 얻을 수 있습니다.
Explicit 공통 파라미터
-
EnableExplicitAutoRadius(bool bEnableAutoRadius)
- Default Value : true
- true : 표면 재구성에서 이어지는 삼각형의 최대 반경을 자동으로 계산합니다.
SetExplicitMaxRadiusCoefficient
로 자동으로 계산된 반경에 계수를 적용할 수 있습니다. - false :
SetExplicitMaxRadius
를 통해 사용자가 직접 최대 반경을 지정할 수 있습니다.
-
SetExplicitMaxRadiusCoefficient(float f32Coefficient)
- Default Value : 1
- Max Radius : 자동 계산된 반경(점 집합의 평균 거리) * f32Coefficient로 내부적으로 계산되어 사용됩니다.
-
SetExplicitMaxRadius(float f32MaxRadius)
- Default Value : 0.01
- f32MaxRadius : 표면 재구성에서 이어지는 삼각형의 최대 반경을 지정합니다.
-
SetExplicitMinDihedralAngle(float f32MinAngle)
- Default Value : 150
- f32MinAngle : 인접 삼각형과 이루는 이면각의 최소 각도를 지정합니다.해당 각도를 낮게 설정 할 수록 토폴로지를 위반하는 삼각형이 발생할 가능성이 높아집니다.
-
SetExplicitMaxSeed(int32_t i32MaxSeed)
- Default Value : 100
- Recommended Value : 100, 1000, 5000, 10000
- i32MaxSeed : 재구성 시작 삼각형의 최대 개수를 설정합니다. 하나의 시작점에서 충분한 재구성을 하지 못하였을 때 시작 지점을 다시 탐색 해야하며, 탐색 횟수를 제어하는 역할을 합니다.
- Explicit Sculpture : i32MaxSeed 값이 커질 수록 성능이 저하되며 정확도가 높아집니다.
- Explicit Region Growing : i32MaxSeed 값이 커질 수록 성능과 정확도 모두 높아지지만 노이즈성 데이터에 취약해집니다.
-
EnableExplicitHoleFillingAutoRadius(bool bHoleFillingAutoRadius)
- Default Value : true
- true : Hole Filling 동작 시 삼각형의 최대 반경을 자동으로 계산합니다.
SetExplicitHoleFillingRadiusCoefficient
로 자동으로 계산된 반경에 계수를 적용할 수 있습니다. - false :
SetExplicitHoleFillingRadius
를 통해 사용자가 직접 최대 반경을 지정할 수 있습니다.
-
SetExplicitHoleFillingRadiusCoefficient(float f32Coefficient)
- Default Value : 1
- Max Radius : 자동 계산된 반경(점 집합의 평균 거리) * f32Coefficient로 내부적으로 계산되어 사용됩니다.
-
SetExplicitHoleFillingRadius(float f32HoleFillingRadius)
- Default Value : 0.01
- f32HoleFillingRadius : Hole Filling 이어지는 삼각형의 최대 반경을 지정합니다.
-
SetExplicitHoleFillingNeighborCount(int32_t i32Neighbor)
- Default Value : 40
- Recommended Value : 20, 40, 60, 80, 100
- i32Neighbor : Hole Filling 동작 시 탐색할 이웃 점의 개수를 지정합니다. 개수를 늘릴 수록 삼각형 후보가 많아져 결과에 영향을 미칩니다.
-
SetExplicitMaxHoleLength(int32_t i32MaxHoleLength)
- Default Value : 40
- Recommended Value : 20, 40, 60, 80, 100
- i32MaxHoleLength : Hole로 간주할 최대 에지 수를 설정합니다. Hole을 이루는 연속적인 가장자리 에지의 개수를 제어할 수 있습니다.
Explicit Region Growing 파라미터
-
EnableExplicitAutoCellRadius(bool bAutoCellRadius)
- Default Value : true
- true : Explicit Region Growing 방법 시 사용되는 그리드 셀의 거리를 자동으로 계산합니다.
SetExplicitCellRadiusCoefficient
로 자동으로 계산된 거리에 계수를 적용할 수 있습니다. - false :
SetExplicitCellRadius
를 통해 사용자가 직접 그리드 거리를 지정할 수 있습니다.
-
SetExplicitCellRadiusCoefficient(float f32Coefficient)
- Default Value : 1
- Grid Cell Distance : 자동 계산된 거리(점 집합의 평균 거리) * f32Coefficient로 내부적으로 계산되어 사용됩니다.
-
SetExplicitCellRadius(float f32MaxCellRadius)
- Default Value : 0.01
- f32MaxCellRadius : 그리드 셀의 거리를 지정합니다.
-
SetExplicitMaxNormalAngle(float f32MaxNormalAngle)
- Default Value : 90
- Recommended Value 90, 120, 150
- f32MaxNormalAngle : Face 위 세점의 법선 벡터가 이루는 최대 각도를 설정합니다. 같은 표면위에 있다면 재구성으로 형성된 Face 위 세 법선 벡터 간 각도가 크지 않을 것이지만, Sharp Feature가 많은 데이터는 해당 파라미터로 인해 재구성 정확도가 떨어질 수도 있습니다.
Implicit 파라미터
-
SetImplicitMaxDepth(int32_t i32MaxDepth)
- Default Value : 8
- Recommended Value : 2 ~ 12
- i32MaxDepth : Octree의 최대 깊이를 설정합니다. 값을 크게 할 수록 해상도가 좋아지지만 전체적인 성능이 하락합니다.
-
SetImplicitSolverDepth(int32_t i32SolverDepth)
- Default Value : 8
- Recommended Value : 2 ~ 12 ( <= MaxDepth)
- i32SolverDepth : 암시적 표면 재구성 함수에 필요한 계산을 사전에 수행하는 동작에 있어 필요한 값입니다. 설정한 깊이까지 해당하는 Octree의 모든 Node들이 사전 계산에 사용됩니다. 메모리를 적게 사용할 수 있지만 성능이 저하될 가능성이 있습니다.
4 예제 코드
CSurfaceReconstruction3D SurfaceReconstruction3D;
CFL3DObject floSource;
CFL3DObject floDestination;
floSource.Load(L"C:\\Users\\Public\\Documents\\FLImaging\\ExampleImages\\SurfaceReconstruction3D\\Source.ply");
SurfaceReconstruction3D.SetSourceObject(floSource);
SurfaceReconstruction3D.SetDestinationObject(floDestination);
SurfaceReconstruction3D.EnableSamplingPointCloud(false);
SurfaceReconstruction3D.EnableExplicitAutoRadius(true);
SurfaceReconstruction3D.SetExplicitMaxRadiusCoefficient(5.000000f);
SurfaceReconstruction3D.EnableExplicitHoleFillingAutoRadius(true);
SurfaceReconstruction3D.SetExplicitHoleFillingRadiusCoefficient(5.000000f);
SurfaceReconstruction3D.SetExplicitMaxSeed(1000);
SurfaceReconstruction3D.EnableExplicitAutoCellRadius(true);
SurfaceReconstruction3D.SetExplicitCellRadiusCoefficient(1.000000f);
SurfaceReconstruction3D.Execute();