본문 바로가기

# 미사용/OpenCV

[OpenCV] 기본 클래스 생성


 기본 클래스

OpenCV에서 연산의 주체가 되는 클래스이다.


기본 클래스 종류

  • Vec

  • Point_

  • Point3_

  • Size_

  • Rect_

  • RotatedRect

  • Scalar_



 기본 클래스 훑어보기

# Vec<typename _Tp,  int n>

_Tp 자료형의 데이터를 n개 담을 수 있는 클래스이다.

고정배열이라고 생각하면 편하다.

Vec<int, 2> vec = {3, 4};
cout << vec[0] << '\n';  //! 3이 출력된다.
cout << vec[1] << '\n';  //! 4가 출력된다.



# Point_<typename _Tp>

2차원 평면 좌표를 가르키는 클래스이다.

각 좌표는 _Tp 자료형으로 주어져야 한다. 

Point_<int> point(2, 3);
cout << point << '\n';  //! [2, 3]이 출력된다.



# Point3_<typename _Tp>

3차원 공간 좌표를 가르키는 클래스이다.

각 좌표는 _Tp 자료형으로 주어져야 한다.

Point3_<double> point(1.1, 2.2, 3.3);
cout << point << '\n';



# Size_<typename _Tp>

2차원 도형의 크기를 가르키는 클래스이다.

크기를 나타낼 뿐, 아직 사각형은 아님에 주의하자.

Size_<int> size(1, 2);
cout << size << '\n';   //! [1 x 2]가 출력된다.



# Rect_ <typename _Tp>

사각형을 가르키는 클래스이다.

/**
 * (0, 1)에서 시작하는 [5 x 6] 크기의 사각형.
 */
Point_<int> top_left(0, 1);
Size_<int> size(5, 6);
Rect_<int> rect(top_left, size);
cout << rect << '\n';   //! [5 x 6 from (0, 1)]이 출력된다.



# RotatedRect

회전된 사각형을 가르키는 클래스이다.

항상 float 원소만 받는다.

/**
 * (0, 1)에서 시작하는 [5 x 6] 크기의 사각형을,
 * (0, 1)을 중심으로 20도 만큼 시계방향으로 회전시킨 사각형.
 */
Point_<float> top_left(0, 1);
Size_<float> size(5, 6);
float angle = 20;
RotatedRect rect(top_left, size, angle);



# Scalar_<typename _Tp>

하나의 화소를 가르키는 클래스.

내부적으로 4개의 숫자로 구성되어 있으며,

각각 bgr + alpha 값으로 되어있다.  (rgb가 아니다..!)

초기화 하지 않은 값은 0으로 설정된다.

Scalar_<int> pixel(0, 100, 200, 1); //! bgr + alpha
cout << pixel[0] << '\n';   //! blue 0
cout << pixel[1] << '\n';   //! green 100
cout << pixel[2] << '\n';   //! red 200
cout << pixel[3] << '\n';   //! alpha 1




 기본 클래스 축약

위에서 자료형을 기술할 때 마다, 타입이름을 길게 써주는 것은 귀찮다.

아래처럼 숫자와 알파벳 한글자로 짧게 표현할 수 있도록, 미리 정의되어 있다.

using Vec2i = Vec<int, 2>;
using Vec4f = Vec<float, 4>;


# 숫자 영역

내부적인 데이터의 개수.



# 알파벳 영역

  • i -> int32

  • l -> int64

  • f -> float

  • d -> double

  • b -> unsigned char

  • s -> short

  • w -> unsigned short


# Vec<T, n>

/** @name Shorter aliases for the most popular specializations of Vec<T,n>
  @{
*/
typedef Vec<uchar, 2> Vec2b;
typedef Vec<uchar, 3> Vec3b;
typedef Vec<uchar, 4> Vec4b;

typedef Vec<short, 2> Vec2s;
typedef Vec<short, 3> Vec3s;
typedef Vec<short, 4> Vec4s;

typedef Vec<ushort, 2> Vec2w;
typedef Vec<ushort, 3> Vec3w;
typedef Vec<ushort, 4> Vec4w;

typedef Vec<int, 2> Vec2i;
typedef Vec<int, 3> Vec3i;
typedef Vec<int, 4> Vec4i;
typedef Vec<int, 6> Vec6i;
typedef Vec<int, 8> Vec8i;

typedef Vec<float, 2> Vec2f;
typedef Vec<float, 3> Vec3f;
typedef Vec<float, 4> Vec4f;
typedef Vec<float, 6> Vec6f;

typedef Vec<double, 2> Vec2d;
typedef Vec<double, 3> Vec3d;
typedef Vec<double, 4> Vec4d;
typedef Vec<double, 6> Vec6d;
/** @} */



# Point_<T>

자주 사용되는 Point2i는 간략히 Point로 부른다.

2차원 평면 좌표를 다루기 때문에 2가 붙었다.

typedef Point_<int> Point2i;
typedef Point_<int64> Point2l;
typedef Point_<float> Point2f;
typedef Point_<double> Point2d;
typedef Point2i Point;



# Point3_<T>

typedef Point3_<int> Point3i;
typedef Point3_<float> Point3f;
typedef Point3_<double> Point3d;



# Size_<T>

자주 사용되는 Size2i는 Size로 부른다.

typedef Size_<int> Size2i;
typedef Size_<int64> Size2l;
typedef Size_<float> Size2f;
typedef Size_<double> Size2d;
typedef Size2i Size;



# Rect_<T>

자주 사용되는 Rect2i는 Rect로 부른다.

2차원 사각형을 다루기 때문에 2가 붙었다.

typedef Rect_<int> Rect2i;
typedef Rect_<float> Rect2f;
typedef Rect_<double> Rect2d;
typedef Rect2i Rect;



# RoatedRect

RotatedRect는 항상 float만 다루기 때문에 축약형이 없다.



# Scalar_<T>

자주 쓰이는 Scalar_<double>을 Scalar로 부른다.

축약형이 한 개밖에 없다.

typedef Scalar_<double> Scalar;




 다양한 생성 방법

# Point_

Point2f a(Vec2f(1.0, 3.0));
Point2f b(Size2f(1.0, 3.0));
Point2f c(1.0, 3.0);
Point2f d(c);



# Point3_

Point3f a(Vec3f(1.0, 3.0, 5.0));
Point3f b(1.0, 3.0, 5.0);
Point3f c(a);



# Size_

Size2f a(Vec2f(1.0, 3.0));
Size2f b(Point2f(1.0, 3.0));
Size2f c(1.0, 3.0);
Size2f d(c);



# Rect_

Rect2f a(Point2f(0.0, 1.0), Size2f(4.0, 5.0));
Rect2f b(Point2f(0.0, 1.0), Point2f(4.0, 6.0));
Rect2f c(0.0, 1.0, 4.0, 5.0);
Rect2f d(c);