ROI & Figure
1 CFLFigure
1.1 CFLFigure 개요
FLImaging®에는 도형 객체(CFLFigure
)가 있습니다. 이 도형 객체를 ROI로 사용하거나, 도형 객체 간 연산 등을 할 수 있습니다.
1.2 CFLFigure 제공 기능
- 기본 정보 얻기 : 너비, 높이, 각도, 영역의 넓이, 둘레, 길이, 중심점 등
- 변형 : 이동, 회전, 확대/축소, 뒤집기, warp 등
- 영역 얻기 : BoundaryRect, Minimum Enclosing Rectangle, ConvexHull, RasterRegion, RasterContour, Sampling Points 등
- 도형 간 연산 : 서로 충돌 여부 (IsCollision), 교점 (GetIntersection), 영역 연산 (Intersection, Union, Subtraction, XOR), 최단(혹은 최대) 거리 및 해당하는 점 등
- 속성 설정 : 이름, 그리기 속성(색상, 선 굵기 등), RasterOperation 연산 방식, 사용자 정의 Extra Data 등
- 저장 및 로드 기능
- 쿼리 기능
이외에도 개발에 필요한 풍부한 기능을 제공합니다.
2 도형 생성하기
2.1 도형 생성
도형 객체는 4바이트 정수형(int32_t), 8바이트 정수형(int64_t), 4바이트 부동소수점 실수형(float), 8바이트 부동소수점 실수형(double) 타입으로 생성할 수 있습니다. 아래 예제는 4바이트 정수형 사각형과 4바이트 실수형 사각형을 생성하는 코드입니다.
// Declare a figure object(rectangle)
CFLRect<int32_t> flrInt(0, 0, 100, 100);
CFLRect<float> flrFlt(0.f, 0.f, 100.f, 100.f);
2.2 지원하는 도형 타입 목록
여러 형태의 도형 생성과 풍부한 연산 기능을 통해 정밀한 비전 개발을 경험해 보세요. 지원하는 도형 타입은 아래와 같습니다.
- Scalar
- Point
- Line
- Rect
- RoundRect
- Circle
- Ellipse
- Doughnut
- Quad
- Region
- ComplexRegion
- CubicSpline
- BezierQuadraticCurve
- BezierCubicCurve
- BezierQuarticCurve
- PointArray
- FigureArray
- FigureText
- Point3
- Point4
- Quad3
- Frustum
2.3 도형 간 변환
도형 간 변환이 자유롭게 이루어집니다. 아래와 같이 타원형으로 생성된 도형 객체를 자연스럽게 사각형으로 변환할 수 있습니다.
double f64X = 10.;
double f64Y = 10.;
double f64Radius1 = 2.5;
double f64Radius2 = 8.1;
double f64Angle = 45.;
CFLEllipse<double> fle(f64X, f64Y, f64Radius1, f64Radius2, f64Angle);
// Create rectangle with ellipse
CFLRect<double> flr(fle);
위 코드를 수행하면 아래와 같이 Ellipse를 Rect로 변환할 수 있습니다.
![]() |
![]() |
---|
아래 표는 다양한 도형 객체 간 유사한 형태로 변환하는 예시를 보여 줍니다.
PointArray | Ellipse | BezierCubicCurve |
---|---|---|
![]() |
![]() |
![]() |
Region | Quad | Rect |
![]() |
![]() |
![]() |
3 도형 관련 함수 - 기본 정보 얻기
Width, Height, Angle, Area, Perimeter, Length, Center 좌표 등 도형의 기본적인 정보를 얻어올 수 있습니다.
CFLRect<double> figureRect(0, 0, 20, 10, 15);
double f64Width = figureRect.GetWidth();
double f64Height = figureRect.GetHeight();
double f64Angle = figureRect.GetAngle();
double f64Area = figureRect.GetArea();

4 형태 변환(Transform)
4.1 Offset(도형 이동)
double f64X = 10.;
double f64Y = 10.;
double f64Radius1 = 6.;
double f64Radius2 = 3.;
double f64Angle = 30.;
CFLEllipse<double> fle(f64X, f64Y, f64Radius1, f64Radius2, f64Angle);
fle.Offset(2., 3.);
위 함수를 수행하면 x 방향으로 2, y 방향으로 3 만큼 이동하여 아래와 같이 타원의 중심이 (10, 10)에서 (12, 13)이 됩니다.
Source Figure | Offset | ||
---|---|---|---|
![]() |
![]() |
4.2 Rotate(도형 회전)
CFLEllipse<double> fle(10., 10., 6., 3., 30.);
fle.Rotate(30., fle.GetCenter());
도형을 회전하려면 회전할 각도와 회전 중심 피벗을 전달합니다. 위 코드는 타원의 중심점 주위로 30도 회전하는 예제입니다. 그 결과 아래 그림과 같이 타원의 각도가 기존 30도에서, 회전 후 60도가 되었습니다.
Source Figure | Rotate | ||
---|---|---|---|
![]() |
![]() |
4.3 Scale(도형 크기 변환)
CFLEllipse<double> fle(10., 10., 6., 3., 30.);
fle.Scale(fle.GetCenter(), 1.3, 1.3);
도형을 회전하려면 회전할 각도와 회전 중심 피벗을 전달합니다. 위 코드는 타원의 중심점 주위로 30도 회전하는 예제입니다. 그 결과 아래 그림과 같이 타원의 각도가 기존 30도에서, 회전 후 60도가 됩니다.
Source Figure | Scale | ||
---|---|---|---|
![]() |
![]() |
참고
Inflate()
와Extend()
함수도Scale()
과 비슷하게 도형의 크기 변환과 관련 있는 함수입니다.
4.4 Flip(도형 뒤집기)
도형 뒤집기 연산은 수평 방향으로 뒤집기, 수직 방향으로 뒤집기, 수평 및 수직 방향 모두 뒤집기 세 가지 옵션을 제공합니다.

CFLEllipse<double> fle(10., 10., 6., 3., 30.);
fle.Flip(EFigureFlipDirection_Vertical, fle.GetCenter());
도형을 뒤집으려면 뒤집을 방향과 flip 기준점을 전달합니다. 위 코드는 타원의 중심점을 기준으로 수직 뱡향 flip 하는 예제입니다. 그 결과 아래 그림과 같이 타원이 flip 됩니다.
Source Figure | Flip | ||
---|---|---|---|
![]() |
![]() |
5 Figure 영역
도형의 영역을 얻는 함수 모음에 대해 알아보겠습니다. 도형의 경계 사각형(Boundary Rect, 축 방향과 변이 평행한 사각형), 최소 경계 사각형(Minimum Enclosing Rectangle, 도형을 감싸는 직사각형 중 가장 면적이 작은 것), convex hull을 얻을 수 있습니다.
CFLEllipse<double> fle(10., 10., 6., 3., 30.);
CFLRect<double> flrBoundary = fle.GetBoundaryRect();
CFLQuad<double> flqMER = fle.GetMinimumEnclosingRectangle();
CFLRegion flrgConvexHull;
fle.GetConvexHull(&flrgConvexHull);
BoundaryRect | Minimum Enclosing Rectangle | ConvexHull |
---|---|---|
![]() |
![]() |
![]() |
도형을 이미지의 각 픽셀에 맞게 래스터화하거나, 곡선을 샘플링하여 단순화할 수 있습니다.
CFLEllipse<double> fle(10., 10., 6., 3., 30.);
// Raster Region 결과 영역을 얻을 객체
CFLArray<TRect<int64_t>> flaRasterRegion;
fle.GetRasterRegion(&flaRasterRegion);
// Raster Contour 결과 포인트를 얻을 객체
CFLArray<TPoint<int32_t>> flaRasterContour;
fle.GetRasterContour(&flaRasterContour);
// 3도(degree) 단위로 샘플링
double f64IntervalDegree = 3.;
// 샘플링 결과를 얻을 포인트 어레이 객체
CFLPointArray flpaSamplingPoints;
fle.GetSamplingPoints(f64IntervalDegree, flpaSamplingPoints);
RasterRegion | RasterContour | Sampling Points |
---|---|---|
![]() |
![]() |
![]() |
6 Figure 간 관계
6.1 충돌 여부(IsCollision) 및 교점 구하기(GetIntersection)
IsCollision()
함수를 통해 충돌 여부를 알 수 있고, GetIntersection()
함수를 통해 교점을 구할 수 있습니다.
CFLRect<int32_t> flr1(3, 7, 9, 15);
CFLRect<int32_t> flr2(10, 2, 16, 10);
CFLRect<int32_t> flr3(7, 12, 13, 17);
bool bCollision1And2 = flr1.IsCollision(flr2); // false
bool bCollision1And3 = flr1.IsCollision(flr3); // true
if(bCollision1And2)
{
CFLFigureArray flfaIntersectionResult;
flr1.GetIntersection(flr2, &flfaIntersectionResult);
int64_t i64IntersectionCount = flfaIntersectionResult.GetCount(); // 0
}
if(bCollision1And3)
{
CFLFigureArray flfaIntersectionResult;
flr1.GetIntersection(flr3, &flfaIntersectionResult);
int64_t i64IntersectionCount = flfaIntersectionResult.GetCount(); // 2
}
위 코드를 수행하면 아래 왼쪽 사진과 같이 flr1
과 flr2
가 충돌하지 않을 경우 IsCollision()
에서는 false
를 리턴하고 GetIntersection()
함수에서도 빈 CFLFigureArray
객체를 반환합니다. 아래 오른쪽 사진과 같이 flr1
과 flr3
이 충돌할 경우 IsCollision()
에서는 true
를 리턴하고 GetIntersection()
함수에서는 두 개의 교점이 포함된 CFLFigureArray
객체를 반환합니다.
![]() |
![]() |
---|
6.2 영역 연산
두 도형 영역의 교집합, 합집합, 차집합, XOR 영역을 구할 수 있습니다.
CFLComplexRegion flcr1;
flcr1.PushBack(CFLPoint<double>(103.8, 19.7));
flcr1.PushBack(CFLPoint<double>(157.9, 54.7));
flcr1.PushBack(CFLPoint<double>(157.9, 113.3));
flcr1.PushBack(CFLCircle<double>(39.2, 86.7, 34.6, 0.0, 53.4, -135.4, EArcClosingMethod_NoClose));
CFLComplexRegion flcr2;
flcr2.PushBack(CFLPoint<double>(87.7, 162.1));
flcr2.PushBack(CFLPoint<double>(29.8, 133.9));
flcr2.PushBack(CFLPoint<double>(22.7, 75.7));
flcr2.PushBack(CFLCircle<double>(143.8, 87.8, 34.6, 173.1, 53.4, -135.4, EArcClosingMethod_NoClose));
CFLFigureArray flfaIntersectionResult;
flcr1.GetRegionOfIntersection(&flcr2, &flfaIntersectionResult);
CFLFigureArray flfaUnionResult;
flcr1.GetRegionOfUnion(&flcr2, &flfaUnionResult);
CFLFigureArray flfaSubtractionResult;
flcr1.GetRegionOfSubtraction(&flcr2, &flfaSubtractionResult);
CFLFigureArray flfaExclusiveOrResult;
flcr1.GetRegionOfExclusiveOr(&flcr2, &flfaExclusiveOrResult);
위 코드를 수행하면 아래 사진에서 노란색으로 표시된 영역과 같이 Intersection(왼쪽 위), Union(오른쪽 위), Subtraction(왼쪽 아래), Exclusive Or(오른쪽 아래) 영역을 구할 수 있습니다.

6.3 두 도형 간 최단 거리, 최대 거리 구하기
CFLEllipse<double> flfSrc(239., 213., 23.8, 66.9, 31.14);
CFLEllipse<double> flfDst(156., 126.5, 92.3, 28.3, 135.7);
// Get Minimum Distance
double f64MinDist = flfSrc.GetMinimumDistance(flfDst);
// Get Points of Minimum Distance
CFLPointArray flpaMinDist;
flfSrc.GetPointsOfMinimumDistance(flfDst, &flpaMinDist);
// Get Maximum Distance
double f64MaxDist = flfSrc.GetMaximumDistance(flfDst);
// Get Points of Maximum Distance
CFLPointArray flpaMaxDist;
flfSrc.GetPointsOfMaximumDistance(flfDst, &flpaMaxDist);

최단(혹은 최대) 거리 및 해당하는 점 GetMinimumDistance(Maximum), GetPointsOfMinimumDistance(Maximum) 을 얻어올 수 있습니다.
7 Attribute
Figure 속성에 관련된 내용들을 설정하거나 얻어올 수 있습니다. Name, Draw 속성, RasterOperation 연산 방식, 사용자 정의 Extra Data 등을 설정할 수 있습니다.
CFLRect<double> figureAttribute(0, 0, 20, 10);
figureAttribute.SetName(L"ABC");
figureAttribute.SetAttributeDrawingFillColor(LIME);
figureAttribute.SetExtraAttribute(L"Param 1", L"10");
8 Save/Load
모든 Figure는 저장과 불러오기가 가능합니다.
CFLRect<double> figureSave(0, 0, 20, 10);
figureSave.Save(L"C:/Manual/Rect.fig");
// 타입을 아는 경우
CFLRect<double> figureLoad;
figureLoad.Load(L"C:/Manual/Rect.fig");
// 타입을 모르는 경우 (사용 후 메모리 해제 필요)
CFLFigure* pFigure = CFigureUtilities::LoadFigure(L"C:/Manual/Rect.fig");
//...
if(pFigure)
{
delete pFigure;
pFigure = nullptr;
}
9 FigureUtilities
CFigureUtilities
클래스는 Figure 사용에 도움이 되는 기능들이 있는 클래스입니다.
Figure를 Save하거나 Load할 수 있고, Figure를 문자열로 변환하거나 혹은 반대로 문자열에서 Figure로 변환을 도와줍니다.
Save/Load
CFigureUtilities::SaveFigure(L"C:/Manual/Figure1.fig", pFigure); CFLFigure* pFigureNew = CFigureUtilities::LoadFigure(L"C:/Manual/Figure1.fig");
Figure와 문자열 간 변환
ConvertFigureObjectToString
: Figure를 문자열로 변환합니다.ConvertFigureStringToObject
: 문자열을 Figure로 변환합니다.ConvertImageFiguresToFigureArray
: CFLImage에 문자열로 저장된 Figure를 FigureArray로 변환합니다.ConvertImageFiguresToFigureArrayWithExpression
: 이미지에 있는 Figure들 중에서 조건식에 부합하는 Figure를 FigureArray로 변환합니다.ConvertFigureArrayToImageFigures
: FigureArray에 있는 Figure를 이미지의 Figure로 변환합니다.ConvertFigureArrayToImageFiguresWithExpression
: FigureArray에 있는 Figure들 중에서 조건식에 부합하는 Figure를 이미지의 Figure로 변환합니다.