OpenCV 주요 클래스

강형우·2022년 11월 29일
0

OpenCV

목록 보기
10/17

Point, Size, Rect 클래스

Point_ 클래스

  • 2차원 점의 좌표 표현을 위한 템플릿 클래스
  • 멤버 변수: x,y
  • 멤버 함수: dot(), ddot(), cross(), inside() 등
  • 다양한 사칙 연산에 대한 연산자 오버로딩과 std::cout 출력을 위한 << 연산자 오버로딩을 지원
template<typename _Tp> class Point_
{
public:
	...
    _Tp x, y; //< the point coordinates

};

typedef Point_<int>    point2i;
typedef Point_<int64>  point2l;
typedef Point_<float>  point2f;
typedef Point_<double> point2d;
typedef point2i Point;

Point 연산의 예

  • Point 객체끼리의 덧셈과 뺄셈, 한 점과 숫자 값과의 곱셈 등의 연산을 지원

Size_ 클래스

  • 영상 또는 사각형의 크기 표현을 위한 템플릿 클래스
  • 멤버 변수: width, height
  • 멤버 함수: area()
  • 다양한 사칙 연산에 대한 연산자 오버로딩과 std::cout 출력을 위한 << 연산자 오버로딩을 지원
template<typename _Tp> class Size_
{
public:
	...
    _Tp width, height; //< the width and the height

};

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

Rect_ 클래스

  • 2차원 사각형 표현을 위한 템플릿 클래스
  • 멤버 변수: x, y(x와y는 사각형의 좌측상단 좌표), width, height
  • 멤버 함수: tl(), br(), size(), area(), contains()
  • 다양한 사칙 연산에 대한 연산자 오버로딩과 std::cout 출력을 위한 << 연산자 오버로딩을 지원
template<typename _Tp> class Rect_
{
public:
	...
    _Tp x, y, width, height; //< the width and the height

};

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

Rect 연산의 예

  • Rect객체와 Size, Point 객체의 덧셈과 뺄셈, Rect객체끼리의 논리 연산을 지원
    • Rect클래스의 객체와 Size클래스의 객체를 더할경우 사각형의 가로 세로 크기에 50과 40을 더하는 형태이다.
    • Rect클래스의 객체와 Point클래스의 객체를 더할경우 rect객체가 Point의 좌표만큼 shift하는 형태로 결과가 저장된다.

Range, String 클래스

Range 클래스

  • 정수 값의 범위를 나타내기 위한 클래스
  • 멤버 변수: start, end
  • 멤버 함수: size(), empty(), all()
  • start는 범위에 포함되고, end는 범위에 포함되지 않음:[start, end]
class Range
{
public:
	Range();
    Range(int _start, int _end);
    int size() const;
    bool empty() const;
    static Range all();
    
	int start, end;
};

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

String 클래스

  • 원래 OpenCV에서 자체적으로 정의하여 사용하던 문자열 클래스 였으나 OpenCV 4.x버전부터 std::string클래스로 대체됨
typedef std::string cv::String;
  • cv::format() 함수를 이용하여 형식 있는 문자열 생성 가능 -> C언어의 printf() 함수와 인자 전달 방식이 유사함
String str1 = "Hello";
String str2 = std::string("world");
String str3 = str1 + " " + str2;

Mat imgs[3];
for(int i=0;i<3;i++)
{
	String filename = format("test%02d.bmp", i+1);
    imgs[i] = imread(filename);
}

Vec와 Scalar 클래스

Vec 클래스

  • 벡터(vector)는 같은 자료형 원소 여러 개로 구성된 데이터 형식(e.g 열 벡터)
  • Vec 클래스는 벡터를 표현하는 템플릿 클래스
  • std::cout 출력을 위한 << 연산자 오버로딩을 지원
template<typename _Tp, int m, int n> class Matx
{
public:
	...
    _Tp val[m*n]; //< matrix elements
};

template<typename _Tp, int cn> class Vec : public Matx<_Tp, cn, 1>
{
public:
	...
    const _Tp& operator [](int i) const;
    _Tp& operator[](int i);
};

Vec 클래스 이름 재정의

  • 자주 사용되는 자료형 개수에 대한 Vec 클래스 템플릿의 이름 재정의
  • 형식: VEC<num-of-data>{b|s|w|i|f|d}
  • 주요 Vec 클래스 이름 재정의

Scalar 클래스

  • 크기가 4인 double배열(double val[4])을 멤버 변수로 가지고 있는 클래스
  • 4채널 이하의 영상에서 픽셀 값을 표현하는 용도로 자주 사용
  • []연산자를 통해 원소에 접근 가능
class Scalar{
public:
    double val[4];
    ...
};

Scalar 클래스 객체 생성과 원소 참조 방법

Scalar gray = 128;
cout<< "gray: " << gray << endl;
Scalar yellow(0,255,255);
cout<< "yellow: " << yellow << endl;
for (int i=0; i < 4; i++)
	cout << yellow.val[i] << "," <<yellow[i] <<endl; // 서로 동일하다

행렬과 Mat 클래스

행렬(matrix)이란?

  • 수나 기호, 수식 등을 네모꼴로 배열한 것. 괄호로 묶어 표시
  • e.g) 2x3 행렬

행렬의 기본 연산


Mat 클래스

  • n차원 1채널 또는 다채널 행렬 표현을 위한 클래스
    • 실수 또는 복소수 행렬, 그레이스케일 또는 트루컬러 영상, 벡터 필드, 히스토그램, 텐서(tensor)등을 표현
  • 다양한 형태의 행렬 생성, 복사, 행렬 연산 기능을 제공
    • 행렬의 생성시 행렬의 크기, 자료형과 채널 수(타입), 초기값 등을 지정할 수 있음
    • 복사생성자 & 대입 연산자는 얕은 복사 수행(참조계수로 관리)
    • 깊은 복사는 Mat::copyTo() 또는 Mat::clone()함수 사용
    • 다양한 사칙 연산에 대한 연산자 오버로딩과 std::cout 출력을 위한<< 연산자 오버로딩을 지원
  • 행렬의 원소(픽셀 값)접근 방법을 제공
    • Mat::data 멤버 변수가 실제 픽셀 데이터 위치를 가리킴
    • Mat::at<typename>(int y, int x)또는 Mat::ptr<typename>(int y)함수 사용을 권장

Mat클래스 정의

class Mat
{
public:
	Mat();
    Mat(int rows, int cols, int type);
    ...
    
    void create(int rows, int cols, int type);
    Mat& operator = (const Mat& m);
    Mat clone() const;
    void copyTo(OutputArray m) const;
    template<typename _Tp> _Tp* ptr(int i0 = 0);
    template<typename _TP> _Tp& at(int row, int col);
    ...
    
    int dims;		// 행렬의 차원. 일반적인 영상은 항상 2
    int rows, cols; // 행렬의 행(세로) 크기, 열(가로) 크기, 주로 이 두개의 멤버변수 사용
    				// dims==2 인 경우에만 유효
    uchar* data;	// 동적 할당된 메모리 영역 주소
    ...
}

Mat 클래스의 깊이(depth)

  • 행렬 원소가 사용하는 자료형 정보를 가리키는 매크로 상수
  • Mat::depth() 함수를 이용하여 참조
  • 형식: CV_<bit-depth>{U|S|F}

Mat 클래스의 채널(channel)

  • 원소 하나가 몇 개의 값으로 구성되어 있는가?
  • Mat::channels() 함수를 이용하여 참조
  • e.g) 그레이스케일 영상은 픽셀 하나 당 밝기 값 1개. 트루컬러 영상은 픽셀 하나 당 B,G,R 색상 성분 3개

Mat 클래스의 타입(type)

  • 행렬의 깊이와 채널 수를 한꺼번에 나타내는 매크로 상수
  • Mat::type() 함수를 이용하여 참조

속성 참조 예제 코드


InputArray와 OutputArray 클래스

InputArray 클래스

  • 주로 Mat 클래스를 대체하는 프록시 클래스(proxy class)로 OpenCV 함수에서 입력 인자로 사용됨
  • 사용자가 명시적으로 _InputArray 클래스의 인스턴스 또는 변수를 생성하여 사용하는 것을 금지

OutputArray 클래스

  • OpenCV 함수에서 출력 인자로 사용되는 프록시 클래스
  • _OutputArray 클래스는 _InputArray 클래스를 상속받아 만들어졌으며, 새로운 행렬을 생성하는 create()함숙 정의되어 있음.
  • InputOutputArray 클래스
    • OpenCV 함수에서 입력이자 출력으로 사용되는 프록시 클래스

0개의 댓글