[컴퓨터 비전] OpenCV 기본 자료형 클래스

Ogu·2023년 9월 18일
0
post-thumbnail

OpenCV는 컴퓨터 비전 프로그래밍에서 자주 사용되는 다양한 자료형 클래스를 지원합니다.
이번 시간에는 다음 기본 자료형 클래스들에 대해서 알아보겠습니다.

  • Point_ 클래스 : 셀의 좌표 표현
  • Size_ 클래스 : 사각형 영역의 크기 표현
  • Rect_ 클래스 : 사각형의 위치와 크기 정보 표현
  • RotatedRect 클래스 : 회전된 사각형 표현
  • Range 클래스 : 범위 표현
  • String 클래스 : 문자열 표현

Point_ 클래스

Point_ 클래스는 2차원 평면 위에 있는 점의 좌표를 표현하는 템플릿 클래스로, 2차원 좌표를 나타내는 x값과 y값을 갖습니다.

Point_ 클래스는 템플릿 클래스로 실제로 사용시에 어떤 자료형으로 표현할 것인지 명시해야 합니다. 하지만 매번 자료형을 명시하는 것은 번거롭기 때문에 자주 사용하는 자료형에 한해 Point_ 클래스 이름을 재정의하여 제공하고 있습니다.

  • 정수 int형 -> Point2i 클래스 사용 -> 정수형 좌표를 많이 사용하기 때문에 Point 클래스로 시 재정의
  • float 자료형 -> Point2f 클래스 사용

따라서 2차원 정수 좌표계에서의 표현은 Point 클래스를 사용합니다.

Point_ 클래스 정의와 이름 재정의

01    template<typename _Tp> class Size_
02    {
03    public:
04        Size_();
05        Size_(_Tp _width, _Tp _height);
06        Size_(const Size_& sz);
07     
08        Size_& operator = (const Size_& sz);
09     
10        _Tp area() const;
11        bool empty() const;
12     
13        _Tp width, height;
14    };
15     
16    typedef Size_<int>    Size2i;
17    typedef Size_<int64>  Size2l;
18    typedef Size_<float>  Size2f;
19    typedef Size_<double> Size2d;
20    typedef Size2i        Size;

Point 클래스 예제

Point 객체끼리 덧셈 연산을 하면 x좌표와 y좌표를 각각 더하여 새로운 좌표를 생성합니다.

void test_point()
{
	Point pt1;					// pt1 = (0, 0)
	pt1.x = 5; pt1.y = 10;		// pt1 = (5, 10)
	Point pt2(10, 30);			// pt1 = (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

	cout << "pt1: " << pt1 << endl;
	cout << "pt2: " << pt2 << endl;
}
  • Point::dot() : 두 점의 내적을 계산하는 멤버 함수
    -> x좌표끼리 곱한 값에 y좌표끼리 곱한 값을 더하여 계산
  • == | != : 객체끼리의 비교

Size_ 클래스

Size_ 클래스는 영상 또는 사각형 영역의 크기를 표현하는 템플릿 클래스 입니다
사각형 영역의 가로와 세로 크기를 나타내는 widthheight 멤버 변수를 갖고 있습니다.

마찬가지로 템플릿 클래스이기 때문에 자료형을 명시해주어야 합니다.

  • 정수 int형 -> Size2i -> Size라는 이름으로 재정의
  • float형 -> Size2f

따라서 2차원 정수 좌표계에서의 크기 표현은 Size 클래스를 사용합니다.

Size_ 클래스 정의와 이름 재정의

01    template<typename _Tp> class Size_
02    {
03    public:
04        Size_();
05        Size_(_Tp _width, _Tp _height);
06        Size_(const Size_& sz);
07     
08        Size_& operator = (const Size_& sz);
09     
10        _Tp area() const;
11        bool empty() const;
12     
13        _Tp width, height;
14    };
15     
16    typedef Size_<int>    Size2i;
17    typedef Size_<int64>  Size2l;
18    typedef Size_<float>  Size2f;
19    typedef Size_<double> Size2d;
20    typedef Size2i        Size;

Size 클래스 예제

Point 객체끼리 덧셈 연산을 하면 가로 크기와 세로 크기를 각각 더하여 새로운 크기 객체를 생성합니다.

void test_point()
{
	Size sz1, sz2(10, 20);				//sz1 = [0 x 0], sz2 = [10 x 20]	
	sz1.width = 5; sz1.height = 10;		//sz1 = [5 x 10]

	Size sz3 = sz1 + sz2;				// sz3 = [15 x 30]
	Size sz4 = sz1 * 2;				    // sz4 = [10 x 20]
	int area1 = sz4.area();				// area1 = 200

	cout << "sz3: " << sz3 << endl;
	cout << "sz4: " << sz4 << endl;
}
  • Size_::area() : 사각형 크기에 해당하는 면적 반환

Rect_ 클래스

Rect_ 클래스는 사각형의 위치와 크기 정보를 표현하는 템플릿 클래스 입니다.
사각형의 좌측 상단 점의 좌표를 나타내는 x, y 멤버 변수와 사각형의 가로 및 세로 크기를 나타내는 width, height 멤버 변수를 가지고 있습니다.

Rect또한 아래와 같이 자료형을 명시해주어야 합니다.

  • 정수 int형 -> Rect2i -> Rect라는 이름으로 재정의
  • float형 -> Rect2f

마찬가지로 2차원 정수 좌표계에서의 사각형 정보 표현은 Rect 클래스를 사용합니다.

Rect_ 클래스 정의와 이름 재정의

01    template<typename _Tp> class Rect_
02    {
03    public:
04        Rect_();
05        Rect_(_Tp _x, _Tp _y, _Tp _width, _Tp _height);
06        Rect_(const Rect_& r);
07        Rect_(const Point_<_Tp>& org, const Size_<_Tp>& sz);
08        Rect_(const Point_<_Tp>& pt1, const Point_<_Tp>& pt2);
09     
10        Rect_& operator = ( const Rect_& r );
11     
12        Point_<_Tp> tl() const;
13        Point_<_Tp> br() const;
14        Size_<_Tp> size() const;
15        _Tp area() const;
16        bool empty() const;
17        bool contains(const Point_<_Tp>& pt) const;
18     
19        _Tp x, y, width, height;
20    };
21     
22    typedef Rect_<int>    Rect2i;
23    typedef Rect_<float>  Rect2f;
24    typedef Rect_<double> Rect2d;
25    typedef Rect2i        Rect;

Rect 클래스 예제

	Rect rc1;					// rc1 = [0 x 0 from (0, 0)]
	Rect rc2(10, 10, 60, 40);	// 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 from (20, 20)]

	Rect rc5 = rc3 & rc4;	 // rc5 = [30 x 20 from (10, 10)]
	Rect rc6 = rc3 | rc4;	// rc6 = [80 x 60 from (0, 0)]

	cout << "rc5: " << rc5 << endl;
	cout << "rc6: " << rc6 << endl;
  • + Point 연산 : 사각형 위치 이동
  • & 연산 :두 사각형이 교차하는 사각형 영역 반환
  • | 연산 : 두 사각형을 모두 포함하는 최소 크기의 사각형 반환

RotatedRect 클래스

RotatedRect 클래스는 회전된 사각형을 표현하는 클래스 입니다

멤버 변수

  • center : 회전된 사각형의 중심 좌표
  • size : 사각형의 가로 및 세로 크기
  • angle : 회전 각도 정보

RotatedRect클래스는 앞선 자료형과 달리 템플릿 클래스가 아니며, 모든 정보를 float 자료형을 사용하여 표현합니다.

  • 중심점 좌표 -> Point2f 클래스
  • 크기 정보 -> Size2f 클래스
  • 회전 각도 -> float 자료형

ex) 중심 좌표가 (40, 30), 크기는 40 * 20, 시계방향으로 30도 회전된 사각형 객체
RotatedRect rr1(Point2f(40, 30), Size2f(40, 20), 30.f);

마찬가지로 2차원 정수 좌표계에서의 사각형 정보 표현은 Rect 클래스를 사용합니다.

RotatedRect 클래스 정의와 이름 재정의

01    class RotatedRect
02    {
03    public:
04        RotatedRect();
05        RotatedRect(const Point2f& _center, const Size2f& _size, float _angle);
06        RotatedRect(const Point2f& point1, const Point2f& point2, const Point2f& point3);
07     
08        void points(Point2f pts[]) const;
09        Rect boundingRect() const;
10        Rect_<float> boundingRect2f() const;
11     
12        Point2f center;
13        Size2f size;
14        float angle;
15    };

Rect 클래스 예제

	RotatedRect rr1(Point2f(40, 30), Size2f(40, 20), 30.f);
	Point2f pts[4];
	rr1.points(pts);
	Rect br = rr1.boundingRect();
  • PointRect::points() : 사각형의 좌측 하단 꼭지점부터 시계 방향으로 꼭지점 좌표 추출
    -> 크기가 4인 Point2f 자료형의 배열 이름 전달
    -> 네 꼭지점 좌표를 pts 배열에 저장
    Point2f pts[4];
    rr1.points(pts);
  • PointRect:boundingRect() : 회전된 사각형의 바운딩 박스를 구함
    -> 바운딩 박스 : 특정 객체를 감싸는 최소 크기의 사각형
    -> 실수 단위로 얻고 싶은 경우 PointRect:boundingRect2f() 함수 사용

Range 클래스

Range 클래스는 범위 또는 구간을 표현하는 클래스 입니다

멤버 변수

  • start : 범위의 시작 (포함 O)
  • end : 범위의 끝 (포함 X)

start부터 end까지 정수 단위 범위를 표현합니다.
start는 범위에 포함되고, end는 범위에 포함되지 않습니다.

Range 클래스 정의와 이름 재정의

01    class Range
02    {
03    public:
04        Range();
05        Range(int _start, int _end);
06     
07        int size() const;
08        bool empty() const;
09        static Range all();
10     
11        int start, end;
12    };

Rect 클래스 예제

Range r1(0, 10);

String 클래스

String 클래스는 영강 출력 창에 고유의 문자열을 지정해 구분핫고, 영상에 문자열을 출력하는 기능을 제공합니다.

C++ 표준 라이브러리(STL)에서는 std::string 클래스를 이용하여 문자열을 저장하고 처리합니다. String 클래스는 이 std:string 클래스와 완전히 호환되어, 거의 유사하게 사용할 수 있습니다.

OpenCv 4.0버전부터는 자체적인 String 클래스 정의를 삭제하고, C++ 표준 라이브러리의 std::string 클래스를 String 클래스로 이름 재정의 하여 사용합니다.

  • OpenCV 헤더 파일 > typedef std:string String;

따라서 OpenCV 4.0 버전부터 std::string 클래스와 String 클래스는 완전히 같은 클래스이며, OpenCV 에서는 String 클래스 이름을 사용합니다.

format() 함수

특정한 형식의 문자열을 만들 때, format() 함수를 사용합니다.
함수의 인자를 설정하면 그에 해당하는 출력 문자열이 String 객체 형태로 반환됩니다.

String format(const char* fmt, ...);

  • fmt : 형식 문자열
  • ... : 가변 인자
  • 반환값 : 지정한 형식으로 생성된 문자열
Range r1(0, 10);

String 클래스 예제

	Mat imgs[3];
	for (int i = 0; i < 3; i++) {
		String filename = format("test%02d.bmp", i + 1);
		imgs[i] = imread(filename);
	}
profile
Hello! I am Ogu, a developer who loves learning and sharing! 🐤🐤 <br> こんにちは!学ぶことと共有することが好きな開発者のOguです!🐤

0개의 댓글