ROI & Figure

1 CFLFigure

1.1 CFLFigure 개요

FLImaging®에는 도형 객체(CFLFigure)가 있습니다. 이 도형 객체를 ROI로 사용하거나, 도형 객체 간 연산 등을 할 수 있습니다.

1.2 CFLFigure 제공 기능

이외에도 개발에 필요한 풍부한 기능을 제공합니다.

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 지원하는 도형 타입 목록

여러 형태의 도형 생성과 풍부한 연산 기능을 통해 정밀한 비전 개발을 경험해 보세요. 지원하는 도형 타입은 아래와 같습니다.

  1. Scalar
  2. Point
  3. Line
  4. Rect
  5. RoundRect
  6. Circle
  7. Ellipse
  8. Doughnut
  9. Quad
  10. Region
  11. ComplexRegion
  12. CubicSpline
  13. BezierQuadraticCurve
  14. BezierCubicCurve
  15. BezierQuarticCurve
  16. PointArray
  17. FigureArray
  18. FigureText
  19. Point3
  20. Point4
  21. Quad3
  22. 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로 변환할 수 있습니다.

Original Ellipse
Fig. Original Ellipse
Convert Ellipse to Rect
Fig. Convert Ellipse to Rect

아래 표는 다양한 도형 객체 간 유사한 형태로 변환하는 예시를 보여 줍니다.

PointArray Ellipse BezierCubicCurve
PointArray Ellipse BezierCubicCurve
Region Quad Rect
Region Quad Rect
Figure 간 변환

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();
Figure 기본 정보 예시
Fig. Figure 기본 정보 예시

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
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
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
Source Figure Scale

참고

4.4 Flip(도형 뒤집기)

도형 뒤집기 연산은 수평 방향으로 뒤집기, 수직 방향으로 뒤집기, 수평 및 수직 방향 모두 뒤집기 세 가지 옵션을 제공합니다.

Flip Direction
Flip Direction
CFLEllipse<double> fle(10., 10., 6., 3., 30.);
fle.Flip(EFigureFlipDirection_Vertical, fle.GetCenter());

도형을 뒤집으려면 뒤집을 방향과 flip 기준점을 전달합니다. 위 코드는 타원의 중심점을 기준으로 수직 뱡향 flip 하는 예제입니다. 그 결과 아래 그림과 같이 타원이 flip 됩니다.

Source Figure 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
BoundaryRect Minimum Enclosing Rectangle ConvexHull
Fig. Figure 영역

도형을 이미지의 각 픽셀에 맞게 래스터화하거나, 곡선을 샘플링하여 단순화할 수 있습니다.

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
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
}

위 코드를 수행하면 아래 왼쪽 사진과 같이 flr1flr2가 충돌하지 않을 경우 IsCollision() 에서는 false를 리턴하고 GetIntersection() 함수에서도 빈 CFLFigureArray 객체를 반환합니다. 아래 오른쪽 사진과 같이 flr1flr3이 충돌할 경우 IsCollision() 에서는 true를 리턴하고 GetIntersection() 함수에서는 두 개의 교점이 포함된 CFLFigureArray 객체를 반환합니다.

Intersection Result(0)
Fig. Intersection Result(0)
Intersection Result(2)
Fig. Intersection Result(2)

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(오른쪽 아래) 영역을 구할 수 있습니다.

Region Operation
Fig. Region Operation

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);
GetPointsOfMinimum(Maximum)Distance
Fig. GetPointsOfMinimum(Maximum)Distance

최단(혹은 최대) 거리 및 해당하는 점 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로 변환을 도와줍니다.