Bilinear Spline Warping
1 개요
Bilinear Spline Warping은 설정된 제어 점들을 이용하여 Bilinear spline interpolation 방식을 통해 이미지를 변환하는 알고리즘입니다.
2 알고리즘 상세 설명
Source |
Source points |
Dest points |
Result |
 |
 |
 |
 |
Fig. 알고리즘 수행 결과
3 파라미터 설정 및 사용 방법
-
API
SetInterpolationMethod(EInterpolationMethod eMethod = EInterpolationMethod_Bilinear)
- Bilinear Spline Warping 연산 시 보간 방법을 설정합니다.
eMethod
- Default Value : EInterpolationMethod_Bilinear
SetCalibrationPointArray(Foundation::CFLPointArray& flpaSource, Foundation::CFLPointArray& flpaDestination)
- Source및 Destination의 캘리브레이션 포인트를 설정 합니다.
Calibrate()
- 설정된 Source Points Array와 Destination Points Array로 Calibrate를 수행합니다.
Load(Base::CFLString<wchar_t> wstrPath)
Save(Base::CFLString<wchar_t> wstrPath)
-
예제 코드
CBilinearSplineWarping BilinearSplineWarping;
CFLImage fliLearnImage;
if(fliLearnImage.Load(L"../../ExampleImages/BilinearSplineWarping/chess.flif").IsFail())
break;
BilinearSplineWarping.SetSourceImage(fliLearnImage);
CFLPointArray flpaSource;
flpaSource.PushBack(CFLPoint<double>());
flpaSource.PushBack(CFLPoint<double>(300.000000, 0.000000));
flpaSource.PushBack(CFLPoint<double>(0.000000, 420.000000));
flpaSource.PushBack(CFLPoint<double>(300.000000, 420.000000));
CFLPointArray flpaDestination;
flpaDestination.PushBack(CFLPoint<double>(43.003413, 34.402730));
flpaDestination.PushBack(CFLPoint<double>(277.064846, 28.668942));
flpaDestination.PushBack(CFLPoint<double>(24.368601, 398.498294));
flpaDestination.PushBack(CFLPoint<double>(232.627986, 362.662116));
BilinearSplineWarping.SetCalibrationPointArray(flpaSource, flpaDestination);
if(BilinearSplineWarping.Calibrate().IsFail())
break;
if(BilinearSplineWarping.Save(L"../../ExampleImages/BilinearSplineWarping/learnCalibration").IsFail())
break;
if(BilinearSplineWarping.Load(L"../../ExampleImages/BilinearSplineWarping/learnCalibration").IsFail())
break;
CFLImage fliSourceImage;
if(fliSourceImage.Load(L"../../ExampleImages/BilinearSplineWarping/chess.flif").IsFail())
break;
BilinearSplineWarping.SetSourceImage(fliSourceImage);
CFLImage fliDestinationImage;
BilinearSplineWarping.SetDestinationImage(fliDestinationImage);
if(BilinearSplineWarping.Execute().IsFail())
break;
if(fliDestinationImage.Save(L"../../ExampleImages/BilinearSplineWarping/Result.flif").IsFail())
break;
CBilinearSplineWarping BilinearSplineWarping = new CBilinearSplineWarping();
CFLImage fliLearnImage = new CFLImage();
if(fliLearnImage.Load("../../ExampleImages/BilinearSplineWarping/chess.flif").IsFail())
break;
BilinearSplineWarping.SetSourceImage(ref fliLearnImage);
CFLPointArray flpaSource = new CFLPointArray();
flpaSource.PushBack(new CFLPoint<double>());
flpaSource.PushBack(new CFLPoint<double>(300.000000, 0.000000));
flpaSource.PushBack(new CFLPoint<double>(0.000000, 420.000000));
flpaSource.PushBack(new CFLPoint<double>(300.000000, 420.000000));
CFLPointArray flpaDestination = new CFLPointArray();
flpaDestination.PushBack(new CFLPoint<double>(43.003413, 34.402730));
flpaDestination.PushBack(new CFLPoint<double>(277.064846, 28.668942));
flpaDestination.PushBack(new CFLPoint<double>(24.368601, 398.498294));
flpaDestination.PushBack(new CFLPoint<double>(232.627986, 362.662116));
BilinearSplineWarping.SetCalibrationPointArray(flpaSource, flpaDestination);
if(BilinearSplineWarping.Calibrate().IsFail())
break;
if(BilinearSplineWarping.Save("../../ExampleImages/BilinearSplineWarping/learnCalibration").IsFail())
break;
if(BilinearSplineWarping.Load("../../ExampleImages/BilinearSplineWarping/learnCalibration").IsFail())
break;
CFLImage fliSourceImage = new CFLImage();
if(fliSourceImage.Load("../../ExampleImages/BilinearSplineWarping/chess.flif").IsFail())
break;
BilinearSplineWarping.SetSourceImage(ref fliSourceImage);
CFLImage fliDestinationImage = new CFLImage();
BilinearSplineWarping.SetDestinationImage(ref fliDestinationImage);
if(BilinearSplineWarping.Execute().IsFail())
break;
if(fliDestinationImage.Save("../../ExampleImages/BilinearSplineWarping/Result.flif").IsFail())
break;
def main():
bilinearSplineWarping = CBilinearSplineWarping()
fliLearnImage = CFLImage()
if (res := fliLearnImage.Load('../../ExampleImages/BilinearSplineWarping/chess.flif')).IsFail():
ErrorPrint(res, 'Failed to load the image file.')
return
bilinearSplineWarping.SetSourceImage(fliLearnImage)
flpaSource = CFLPointArray()
flpaSource.PushBack(CFLPoint[Double]())
flpaSource.PushBack(CFLPoint[Double](300.000000, 0.000000))
flpaSource.PushBack(CFLPoint[Double](0.000000, 420.000000))
flpaSource.PushBack(CFLPoint[Double](300.000000, 420.000000))
flpaDestination = CFLPointArray()
flpaDestination.PushBack(CFLPoint[Double](43.003413, 34.402730))
flpaDestination.PushBack(CFLPoint[Double](277.064846, 28.668942))
flpaDestination.PushBack(CFLPoint[Double](24.368601, 398.498294))
flpaDestination.PushBack(CFLPoint[Double](232.627986, 362.662116))
bilinearSplineWarping.SetCalibrationPointArray(flpaSource, flpaDestination)
if (res := bilinearSplineWarping.Calibrate()).IsFail():
ErrorPrint(res, 'Failed to calibrate.')
return
if (res := bilinearSplineWarping.Save("../../ExampleImages/BilinearSplineWarping/learnCalibration")).IsFail():
ErrorPrint(res, 'Failed to save.')
return
if (res := bilinearSplineWarping.Load("../../ExampleImages/BilinearSplineWarping/learnCalibration")).IsFail():
ErrorPrint(res, 'Failed to load.')
return
fliSourceImage = CFLImage()
if (res := fliSourceImage.Load('../../ExampleImages/BilinearSplineWarping/chess.flif')).IsFail():
ErrorPrint(res, 'Failed to load the image file.')
return
bilinearSplineWarping.SetSourceImage(fliSourceImage)
fliDestinationImage = CFLImage()
bilinearSplineWarping.SetDestinationImage(fliDestinationImage)
if (res := bilinearSplineWarping.Execute()).IsFail():
ErrorPrint(res, 'Failed to execute.')
return
if (res := fliDestinationImage.Save("../../ExampleImages/BilinearSplineWarping/Result.flif")).IsFail():
ErrorPrint(res, 'Failed to save the image file.')
return
def ErrorPrint(res, str):
if len(str) > 1:
print(str)
print(f'Error code : {res.GetResultCode()}\nError name : {res.GetString()}')