본문 바로가기

컴퓨터 비전 study

OpenCV 기본 자료형 클래스

기본 자료형 클래스

Point_ : 픽셀의 좌표 표현

Size_ : 사각형 영역의 크기 표현

Rect_ : 사각형의 위치와 크기 정보 표현

RotatedRect : 회전된 사각형 표현

Range : 범위 표현

String : 문자열 표현

 

1.1 Point_ 클래스

: 2차원 평면 위에 있는 점의 좌표를 표현하는 템플릿 클래스, x,y 멤버변수

 

Point::dot() 두 점 사이의 내적을 계산하여 반환

   > _Tp dot(const Point_& pt) const;

Point::ddot() 두점 사이의 내적을 실수형으로 계산하여 double 자료형으로 반환

  > double ddot(const Point_& pt) const;

Point::cross() 두 점 사이의 외적을 반환

  > double cross(const Point_& pt) const;

Point::inside() 점의 좌표가 사각형 r 영역 안에 있으면 true를 반환

  > bool insidd(const Rect_<_Tp>& r) const;

 

Point_ 클래스는 템플릿 클래스이기 때문에 실제 사용시에는 어떤 자료형으로 좌표를 표현할 것인지를 명시해야한다.

ex. 정수 좌표-> Point_<int> 클래스 사용

 

OpenCV는 자주 사용하는 자료형에 대하여 Point_클래스 이름을 재정의하여 제공

ex. 정수형 int 자료형 - Point2i 클래스 -> 자주 사용하기때문에 Point 클래스로 재정의

     float 자료형 - Point2f 클래스

typedef Point_<int>     Point2i;

typedef Point_<int64>  Point2l;

typedef Point_<float>   Point2f;

typedef Point_<double> Point2d;

typedef Point2i            Point;

 

좌표를 표현하는 방법은 먼저 기본생성자를 사용하여 멤버 변수를 초기화하고 값을 대입하여 나타내는 방법과

Point pt1      // pt1=(0,0)

pt1.x=5; pt1.y=10;    //pt1=(5,10)

 

처음 생성과 동시에 좌표를 나타내는 방법이 있다.

Point pt2(10,30);       //pt2=(10,30)

 

덧셈 : Point pt3=pt1+pt2;

곱셈 : Point pt4=pt1*pt2;

내적: int d1=pt1.dot(pt2);

동일여부 판단 : bool b1=(pt1==pt2);    <<==또는 =!= 연산자를 이용하여 pt1과 pt2의 좌표가 같은지 다른지 검사

 

C++ 표준 출력을 지원하기때문에 std::cout와 << 연산자를 이용하여 Point_객체의 좌표를 쉽게 출력할 수 있다.

좌표 출력 코드 ->  cout << "pt1:""<<pt1<<endl; 

 

1.2 Size_ 클래스

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

Size::area()   사각형 크기에 해당하는 면적(width X height)을 반환

  > _Tp area() const;

Size::empty() 유효하지 않은 크기이면 true를 반환

  > bool empty() const;

 width : 사각형 영역의 가로 크기 / height : 사각형 영역의 세로 크기

 

다양한 자료형에 대한 Size_ 클래스 이름의 재정의는 Point_ 클래스 이름의 재정의와 동일한 방식이다.

 

Point_클래스와 마찬가지로 기본생성자를 사용하여 생성하여 멤버 변수를 초기화하고 값을 대입하여 나타내는 방법과

Size sz1

sz1.width=5; sz1.height=10;

 

처음 생성과 동시에 크기를 표현하는 방법이 있다.

Size sz2(10,20);

 

Point_ 클래스와 마찬가지로 사칙연산을 이용하여 크기를 조절할 수 있다.

Size sz3=sz1+sz2;    > 각각 가로끼리 세로끼리 더하여 새로운 사각형을 만든다. 즉, sz3=[15 x 30]

Size sz4=sz1 * 2;      > 각각 가로와 세로에 2를 곱한다. 즉, sz4 = [10 x 20]

int area1=sz4.area();  > 사각형의 크기에 해당하는 면적을 반환한다. 즉, area1=200

 

Size_ 클래스도 C++표준 스트림 출력을 지원하며, 객체를 출력하면 크기 정보가 [width x height] 형식으로 출력된다.

 

1.3 Rect_ 클래스

: 사각형의 위치와 크기 정보를 표현한다. 사각형의 좌측 상단 점의 좌표를 나타내는 x,y 멤버 변수와 사각형의 가로 및 세로 크기를 나타내는 width, height 멤버 변수를 가지고 있다.

 

Rect::t1()   사각형의 좌측 상단 점의 좌표 반환

  >Point_<_Tp> tl() const;

Rect::br()   사각형의 우측 하단 점의 좌표 반환

  >Point_<_Tp> br() const;

Rect::size() 사각형의 크기 정보 반환

  >Size_<_Tp> size() const;

Rect::area() 사각형의 면적(width x height) 반환

  > _Tp area() const;

Rect::empty() 유효하지 않은 사각형이면 true를 반환

  > bool empty() const;

Rect::contains() 인자로 전달된 pt점이 사각형 내부에 있으면 true를 반환

  > bool contains(const Point_<_Tp>& pt) const;

 

다양한 자료형에 대한 Rect_ 클래스 이름의 재정의와 정보 표현방법은 위에서 다룬 다른 클래스와 동일한 방식이다.

rc2(10,10,60,40) 은 (10,10) 좌표부터 크기가 60x40인 사각형임을 나타낸다.  rc2=[60x40 from (10,10)]

 

Rect_ 클래스는 Size_ 또는 Point_클래스 객체와의 산술 연산자 재정의가 되어 있다.

rc1=[0x0 from(0,0)],  rc2=[60x40 from (10,10)]

Rect rc3= rc1+Size(50,40);     <rc1의 가로크기와 세로크기가 각각 50과 40만큼 증가 / rc3=[50x40 from(0,0)]

Rect rc4= rc2+Point(10,10)    <rc2 사각형의 위치가 (10,10)만큼 이동  / rc4=[60x40 from (20,20)]

 

두개의 사각형 객체 끼리 & 연산을 수행하면 두 사각형이 교차하는 사각형 영역 반환

Rect rc5=rc3 & rc4;     <rc5=[ 30x20 from (10,10)]

| 연산을 수행하면 두 사각형을 모두 포함하는 최소 크기의 사각형을 반환

Rect rc6= rc3 | rc4;      <rc6=[ 80x60 from (0,0)]

 

1.4 RotatedRect 클래스

: 회전된 사각형을 표현한다. 회전된 사각형의 중심 좌표를 나타내는 center, 사각형의 가로 및 세로 크기를 나타내는 size, 회전각도 정보를 나타내는 angle를 멤버 변수로 가지고 있다.

 

RotatedRect 클래스는 앞서 살펴본 다른 클래스들과 달리 템플릿 클래스가 아니며, 모든 정보를 float 자료형을 사용하여 표현한다. 즉, 중심점 좌표는 Point2f 클래스, 크기 정보는 Size2f, 회전각도는 float 자료형을 사용한다.

 

RotatedRect::points() 회전된 사각형의 네 꼭지점 좌표를 pts 인자에 저장   

  >void points(Point2f pts[]) const;

RotatedRect::boundingRect() 회전된 사각형을 포함하는 최소 크기의 사각형 정보 반환(정수 단위)

  >Rect boundingRect() const;

RotatedRect::boundingRect2f() 회전된 사각형을 포함하는 최소 크기의 사각형 정보 반환(실수단위)

  >Rect_<float> boundingRect2f() const;

 

Point2f center;  > 사각형의 중심좌표

Size2f size;    > 사각형의 크기

float angle;    > 시계 방향 회전 각도

 

코드 작성 방법 -> 중심 좌표(40,30), 크기 40x20, 시계 방향으로 30º만큼 회전

RotatedRect rr1(Point2f (40,30), Size2f (40,20), 30.f );

 

회전된 사각형 개체의 네 꼭지점 좌표를 알고 싶다면 RotatedRect::points() 함수 사용

                                                                  > 사각형의 좌측 하단 꼭지점부터 시계 방향으로 꼭지점 추출한다.

Point2f pts[4];

rr1.points(pts);

위의 코드를 실행하면 회전된 사각형의 네 꼭지점 좌표가 pts 배열에 저장된다.

 

회전된 사각형을 감싸는 최소 크기의 사각형 정보가 필요할때는 RotatedRect::boundingRect() 함수 사용

 * 특정 객체를 감싸는 최소 크기의 사각형 : 바운딩 박스(bounding box)

Rect br = rr1.boundingRect();

 바운딩 박스 사각형의 좌표를 실수 단위로 얻고 싶다면 RotatedRect::boundingRect2f() 함수 사용

 

1.5 Range 클래스

: 범위 또는 구간을 표현한다. 범위의 시작과 끝을 나타내는 start와 end 멤버 변수를 가지고 있다.

 * 범위에 start는 포함되고, end는 포함되지 않는다.

 

Range::size()      범위크기(end-start)를 반환

  >int size() const;

Range::empty()   start와 end가 같으면 true를 반환

  >bool empty() const;

Range::all()         start=INT_MIN, end=INT_MAX로 설정한 Range 객체를 반환

  >static Range all();

 

Range r1(0,10);   > 0부터 9까지의 범위를 표현한다.

 

1.6 String 클래스

C++표준 라이브러리(STL)에서 std::string 클래스를 이용하여 문자열을 저장하고 처리하듯이 OpenCV에서는 cv::string 클래스를 사용하여 문자열을 저장하고 처리할 수 있다.

원래 자체적인 String 클래스가 있었지만 삭제하고 std::string 클래스를 String 클래스로 재정의하였다.

 

String 타입의 문자열 객체는 C/C++언어에서 사용하는 이중 따옴표로 감싸진 문자열로부터 간단하게 만들 수 있고, 덧셈 연산자를 이용하여 이을 수 있다.

ex. String str1= "Hello"

 

객체 내용을 비교하기 위해서는 std::string::compare() 함수 또는 ==연산자 재정의를 사용한다.

  > bool ret = (str2 == "WORLD");

이 때, ==연산자는 대,소문자를 구분한다.

 

특정한 형식의 문자열을 만들고 싶다면 format() 함수를 사용할 수 있다. format() 함수는 가변 인자 함수로 정의되어 있으며 C 언어의 printf()함수와 사용법이 유사하다.

String format(const char*fmt, ...);    fmt : 형식 문자열/ ... : 가변인자 / 반환값 - 지정한 형식으로 생성된 문자열

ex. Mat imgs[3];

     for (int i=0; i<3; i++) {

      String filname = format("test%02d.bmp", i+1);

       imgs[i]=imread(filname);

}

-> test01.bmp, test02.bmp, test03.bmp 에 해당하는 문자열 생성가능

'컴퓨터 비전 study' 카테고리의 다른 글

Open CV Vec와 Scalar 클래스  (0) 2020.02.26
OpenCv Mat 클래스(3)  (0) 2020.02.26
Open CV Mat 클래스(2)  (0) 2020.02.19
OpenCV Mat 클래스(1)  (0) 2020.02.14
Open CV 개요와 기초 사용법  (0) 2020.02.14