6 minute read

3.1 기본 자료형 클래스

3.1.1 Point_ 클래스

Point_ 클래스는 2차원 평면 위에 있는 점의 좌표를 표현하는 템플릿 클래스이다. Point_ 클래스는 2차원 좌표를 나타내는 xy라는 이름의 멤버 변수를 가지고 있다.

 template<typename _Tp> class Point_{
    public:
        Point_();                               //기본 생성자 : x=0, y=0으로 초기화된다.
        Point_(_Tp _x, _Tp_y);                  //(_x, _y)좌표를 인자로 받는 생성자, x=_x, y=_y로 초기화된다.
        Point_(const Point_& pt);               //복사 생성자, x=pt.x, y=pt.y로 초기화된다.

        Point_& operator = (const Point_& pt);  //대입 연산자 재정의

        _Tp dot(const Point_& pt) const;        //Point::dot() 멤버 함수는 두 점 사이의 내적(dot product)을 계산하여 반환한다.
        double ddot(const Point_& pt) const;    //Point::ddot() 멤버 함수는 두 점 사이의 내적을 실수형으로 계산하여 double 자료형으로 반환한다.
        double cross(const Point_& pt) const;   //Point::cross() 멤버 함수는 두 점 사이의 외적(cross product)을 반환한다.
        bool inside(const Rect_<_Tp>& r) const; //Point::inside() 멤버 함수는 점의 좌표가 사각형 r 영역 안에 있으면 true를 반환한다.
        ...
        _Tp x, y;                               //멤버 변수, x는 x축 좌표, y는 y축 좌표를 나타낸다.
 };
 // 다양한 자료형에 대한 Point_클래스 이름 재정의
 typedef Point_<int>    Point2i;
 typedef Point_<int64>  Point2l;
 typedef Point_<float>  Point2f;
 typedef Point_<double> Point2d;
 typedef Point2i        Point;

Point_클래스템플릿 클래스이기 때문에 실제로 사용할 때에는 어떤 자료형으로 좌표를 표현할 것인지 명시해야 한다.(ex. Point_) 클래스를 사용할 때마다 자료형을 명시하는 것이 다소 번거로울 수 있어, OpenCV는 자주 사용하는 자료형에 대하여 Point_클래스 이름을 재정의하여 제공한다.(위 코드 맨 아래 줄 참고)

Point_ 클래스 코드 작성 방법 예시

Point pt1;              //pt1 = (0, 0)
pt1.x = 5; pt1.y = 10;  //pt1 = (5, 10)
Point pt2(10, 30);      //pt2 = (10, 30)
  • 위 코드에서 변수 pt1은 기본 생성자를 사용하여 생성되었다. 이 경우 멤버 변수 pt1.x와 pt1.y는 0으로 초기화된다.
  • 코드의 두 번째 행에서는 대입 연산을 이용해 pt1의 좌표를 업데이트 해준다.
  • pt2는 생성과 동시에 (10, 30)으로 좌표를 초기화 해주었다.
//pt1 = [5, 10], pt2 = [10, 30]
Point pt3 = pt1 + pt2       //pt3 = [15, 40]
Point pt4 = pt1 * 2;        //pt4 = [10, 20]
int d1 = pt1.dot(pt2);      //d1 = 350
bool b1 = (pt1 == pt2);     //b1 = false
  • Point 객체끼리의 덧셈 연산 : x좌표와 y좌표를 각각 더하여 새로운 좌표를 생성한다.
  • Point 객체의 곱하기 연산 : x좌표와 y좌표에 각각 2를 곱한 좌표를 pt4에 저장한다.
  • Point::dot() 함수 : 두 점의 내적을 계산하는 멤버 함수이다.(내적 연산 : 두 점 x좌표끼리 곱한 값에 y좌표끼리 곱한 값을 더하여 계산)
  • Point 객체끼리 동일 유무 검사 : == 또는 != 연산자를 이용하여 두 점의 좌표가 서로 같은지 혹은 다른지 검사 가능하다.
 cout<<"pt1: "<< pt1 << endl;
 cout<<"pt2: "<< pt2 << endl;

 // 출력 결과
 pt1: [5, 10]
 pt2: [10, 30]

OpenCV에서 제공하는 대부분의 자료형 클래스는 C++ 표준 출력을 지원한다. 그러므로 Point_ 객체의 좌표를 std::cout« 연산자를 이용하여 쉽게 출력이 가능한다.

3.1.2 Size_ 클래스

영상 또는 사각형 영역의 크기를 표현할 때에는 Size_ 클래스를 사용한다. Size_ 클래스는 사각형 영역의 가로와 세로 크기를 나타내는 width와 height 멤버 변수를 가지고 있다.

template<typename _Tp> class Size_{
    public: 
        Size_();                                //기본 생성자 : width=0, height=0으로 초기화
        Size_(_Tp _width, _Tp _height);         //(_width, _height)크기를 인자로 받는 생성자, width=_width, height=_height로 초기화
        Size_(const Size_& sz);                 //복사생성자 width=sz.width, height=sz.height로 초기화된다.

        Size_& operator = (const Size_& sz);    //대입 연산자 재정의

        _Tp area() const;                       //Size::area()멤버 함수는 사각형 크기에 해당하는 면적(width X height)을 반환
        bool empty() const;                     //Size::empty()멤버 함수는 유효하지 않은 크기이면 true를 반환

        _Tp width, height;                      //멤버 변수, width는 사각형 영역의 가로 크기, height는 사각형 영역의 세로 크기를 나타낸다.
};
//다양한 자료형에 대한 Size_ 클래스 이름 재정의
typedef Size_<int>    Size2i;
typedef Size_<int64>  Size2l;
typedef Size_<float>  Size2f;
typedef Size_<double> Size2d;
typedef Size2i        Size;
  • Size_ 클래스도 마찬가지로 템플릿으로 정의되어 있다. 자료형 명시의 번거로움을 피하기 위해 다양한 자료형에 대해 이름이 재정의 되어있다. 가장 많이 쓰이는 정수형은 Size2i가 다시 Size로 재정의되어 있다.
  • Size_ 클래스는 정수형 멤버 변수 width, height를 가지고 있는 사각형 크기 표현 클래스이다.

Size_ 클래스 코드 작성 방법 예시

Size sz1, sz2(10, 20);          //sz1 = [0 x 0], sz2 = [10 x 20]
sz1.width = 5; sz1.height = 10; //sz1 = [5 x 10]
  • 기본 생성자 : 기본 생성자로 생성된 변수는 0 x 0크기를 나타내고, 이는 유효하지 않은 크기의 객체이다.
  • 생성과 동시에 초기화 : 변수 sz2는 생성과 동시에 10x20의 크기를 나타낸다.
  • 초기화 : sz1객체의 width, height에 값을 대입함으로 5x10의 크기를 나타내도록 변경했다.
//sz1 = [5 x 10], sz2 = [10 x 20]
Size sz3 = sz1 + sz2;   //sz3 = [15 x 30]
Size sz4 = sz1 * 2;     //sz4 = [10 x 20]
int area1 = sz4.area(); //area1 = 200
  • 객체끼리의 덧셈 연산 : 가로 크기와 세로 크기를 각각 더하여 새로운 크기 객체를 생성한다.
  • 곱하기 연산 : sz1의 width, height에 각각 2를 곱한 결과가 sz4에 저장된다.
  • Size::area() : 사각형 크기에 해당하는 면적을 반환하며 area1에는 10x20=200이 저장된다.
 cout<<"sz3: "<< sz3 << endl;
 cout<<"sz4: "<< sz4 << endl;

 // 출력 결과
 sz3: [15 x 30]
 sz4: [10 x 20]

Size_ 클래스도 C++ 표준 스트림 출력을 지원함으로 정보 출력은 위 코드와 같이 작성한다.

3.1.3 Rect_ 클래스

OpenCV에서 사각형의 위치와 크기 정보를 표현할 때에는 Rect_ 클래스를 사용한다. Rect_ 클래스는 사각형의 좌측 상단 점의 좌표를 나타내는 x, y 멤버 변수와 사각형의 가로 및 세로 크기를 나타내는 width, height 멤버 변수를 가지고 있다.

 template<typename _Tp> class Rect_{
    public: 
        Rect_();                                                //기본 생성자: 모든 멤버 변수를 0으로 초기화
        Rect_(_Tp _x, _Tp _y, _Tp _width, _Tp _height);         //사각형 정보를 인자로 받아 초기화하는 생성자
        Rect_(const Rect_& r);                                  //복사 생성자 : x=r.x y=r.y width=r.width height=r.height
        Rect_(const Point_<_Tp>& org, const Size_<_Tp>& sz);    //좌측 상단 점의 좌표와 사각형의 크기 정보를 인자로 받는 생성자
        Rect_(const Point_<_Tp>& pt1, const Point_<_Tp>& pt2);  //사각형에서 서로 대각 위치에 있는 두 점의 좌표를 인자로 받는 생성자

        Rect_& operator = (const Rect_& r);                     //대입 연산자 재정의

        Point_<_Tp> tl() const;                                 //사각형의 좌측 상단 점의 좌표를 반환
        Point_<_Tp> br() const;                                 //사각형의 우측 하단 점의 좌표를 반환
        Size_<_Tp> size() const;                                //사각형의 크기 정보를 반환
        _Tp area() const;                                       //사각형의 면적(width x hegith)을 반환
        bool empty() const;                                     //유효하지 않은 사각형이면 true를 반환
        bool contains(const Point_<_Tp>& pt) const;             //인자로 전달된 pt 점이 사각형 내부에 있으면 true를 반환

        _Tp x, y, width, height;// x,y : 좌측 상단 점의 좌표, width, height는 사각형의 가로와 세로 크기를 나타냄
 };
 //다양한 자료형에 대한 Rect_클래스 이름 재정의
 typedef Rect_<int>     Rect2i;
 typedef Rect_<float>   Rect2f;
 typedef Rect_<double>  Rect2d;
 typedef Rect2i         Rect;
  • Rect_ 클래스도 템플릿으로 정의되어 있으며, 다양한 자료형에 대해 이름이 재정의되어 있다.

Rect_ 클래스 코드 작성 방법 예시

Rect1 rc1;                  //rc1 = [0 x 0 from (0, 0)]
Rect2 rc2(10, 10, 60, 40);  //rc2 = [60 x 40 from (10, 10)]
  • 주석으로 표시된 부분은 연산에 의해 생성되는 Rect_ 객체의 위치와 크기 정보를 나타낸다. 즉, rc2는 (10, 10) 좌표부터 크기가 60x40인 사각형임을 나타낸다.
  • rc1의 경우 기본 생성자를 사용하여 생성되었으므로, 모든 멤버 변수는 0으로 초기화된다.
  • rc2는 네 개의 정수를 생성자 인자로 사용하였으며, 이 인자들은 차례대로 x, y, width, height 값으로 설정된다.
// Rect_ 객체의 크기 및 위치를 변경하는 코드 예제
// rc1 = [0 x 0 from (0, 0)], rc2 = [60 x 40 from (10, 10)]
Rect rc3 = rc1 + Size(50, 40);  //rc3 = [50 x 40 from (0, 0)]
Rect rc4 = rc2 + Point(10, 10); //rc4 = [60 x 40 fromt (20, 20)]
  • Rect_ 객체 크기 변경 : rc1(모든 멤버 변수가 0으로 초기화된 객체)에 Size(50, 40)을 더하면 rc1의 가로, 세로 크기가 각각 50, 40만큼 증가한다. 그러므로 rc3는 (0, 0) 좌표에서 시작하는 가로 50 세로 40인 사각형을 표현하게 된다.
  • Rect_ 객체 위치 변경 : rc4는 rc2 객체에 Point(10, 10)을 덧셈 연산자를 이용하여 더하였고, 이 경우 rc2 사각형의 위치가 (10, 10)만큼 이동한다. rc2 사각형이 (10, 10)에서 시작하는 60x40 크기의 사각형이므로, rc4는 (20, 20)에서 시작하는 같은 크기의 사각형이 된다.
//Rect_ 객체끼리의 논리 연산 수행
// rc3 = [50 x 40 from (0, 0)], rc4 = [60 x 40 fromt (20, 20)]
Rect rc5 = rc3 & rc4;      //rc5 = [30 x 20 from (20, 20)]
Rect rc6 = rc3 | rc4;      //rc6 = [80 x 60 from (0, 0)]
  • 논리 연산 “&” : 두 사각형에 대해 & 연산을 수행하면 사각형이 겹치는 영역이 반환되며, 아래 그림의 녹색으로 그려진 사각형 영역이다.

Alt text

  • **논리 연산 “ “** : 두 사각형에 대해 연산을 수행하면 두 사각형을 모두 포함하는 최소 크기의 사각형이 반환되며, 아래 그림의 녹색으로 그려진 사각형 영역이다.

Alt text

 cout<<"rc5: "<< rc5 << endl;
 cout<<"rc6: "<< rc6 << endl;

 // 출력 결과
 rc5: [30 x 20 from (20, 20)]
 rc6: [80 x 60 from (0, 0)]

3.1.4 RotatedRect 클래스

3.1.5 Range 클래스

3.1.6 String 클래스