Bicubic Spline Mapping

1.1.1 개요

Bicubic spline mapping은 주어진 데이터 포인트 사이를 부드럽게 연결하는 방법 중 하나로, 특히 2차원 이미지나 곡선 데이터의 매끄러운 보간에 유용합니다. 이 방법은 각 방향(보통 X축과 Y축)에서 이차적인 곡선을 이용하여 전체적으로 부드러운 표면을 생성하며, 모션 좌표 보정 등에 사용될 수 있습니다.

1.1.2 기본 동작

Source control point와 Target control point를 설정하고 알고리즘을 동작하면 Control point 사이의 모든 위치에 대해 이차적인 곡선을 따라 부드러운 표면의 값을 계산하여 좌표 변환이 가능합니다. 아래의 이미지는 빨간색 Source control Point와 파란색 Target control point를 설정하여 Mapping을 진행한 후에, 그 사이의 좌표들을 변환한 결과입니다. Source -> Target 으로 변환이 가능하며, Target -> Source 로의 복원 변환도 지원합니다.

Bicubic Spline Mapping 변환 결과
Fig. Bicubic Spline Mapping 변환 결과

1.1.3 세부 동작

Mapping Grid 범위를 설정하고 가상 확장 영역을 지정하여 초기화를 먼저 진행합니다. Grid 범위에 맞는 Control point들을 설정하고 Finish 함수를 호출하여 Mapping을 진행합니다. Mapping이 완료되면 Save 함수를 통해 파일에 저장이 가능하며, 세팅이 완료된 상태에서 변환을 진행합니다.

1.1.3.1 초기화

Initialize 함수로 그리드 크기를 설정하고 확장 영역을 지정합니다.

CBicubicSplineMapping bcsMapping;

CFLPoint<int32_t> flpGridSize(5, 5);
const int32_t i32Extension = 3;

bcsMapping.Initialize(flpGridSize, i32Extension);
CBicubicSplineMapping bcsMapping = new CBicubicSplineMapping();

CFLPoint<int> flpGridSize = new CFLPoint<int>(5, 5);
int32_t i32Extension = 3;

bcsMapping.Initialize(flpGridSize, i32Extension);

1.1.3.2 Control Point 설정

SetControlPoint 함수를 통해 각 그리드 Index에 해당하는 Source 좌표와 Target 좌표를 설정합니다. 초기화 시 설정했던 Grid 수에 맞는 좌표들을 모두 설정해주어야 합니다.

bcsMapping.SetControlPoint(flpGridIndex, flpSource, flpTarget);
bcsMapping.SetControlPoint(flpGridIndex, flpSource, flpTarget);

1.1.3.3 Mapping

초기화한 Grid Size에 해당하는 Control Point를 모두 설정하였으면, Finish 함수를 호출하여 설정한 데이터를 통해 Mapping을 진행합니다. Finish 함수 동작에 성공하면 좌표변환을 사용할 수 있으며, Save 함수로 Mapping 데이터를 파일로 저장하여 이후 실행에서 Finish 함수 없이 데이터를 Load 하여 바로 재사용이 가능합니다.

if(bcsMapping.Finish().IsOK())
{
    bcsMapping.Save(L"C:/Manual/MappingData.flbcs");
}
if(bcsMapping.Finish().IsOK())
{
    bcsMapping.Save("C:/Manual/MappingData.flbcs");
}

데이터가 있을 경우 Finish 없이 Load 하여 사용 가능

 bcsMapping.Load(L"C:/Manual/MappingData.flbcs");
bcsMapping.Load("C:/Manual/MappingData.flbcs");

1.1.3.4 좌표 변환 및 검증

ConvertSourceToTarget 함수를 사용하여 초기화 시 설정한 Grid 범위 내의 임의의 좌표를 변환할 수 있습니다. ConvertTargetToSource 함수를 사용하면 Target에 해당하는 Grid 범위 내의 임의의 좌표를 본래 Source 좌표로 역변환 할 수 있습니다.

 bcsMapping.ConvertSourceToTarget(flpSource, flpTarget);
bcsMapping.ConvertSourceToTarget(flpSource, out flpTarget);
 bcsMapping.ConvertTargetToSource(flpTarget, flpConvertedSource);
bcsMapping.ConvertTargetToSource(flpTarget, out flpConvertedSource);