OpenCV 주요 클래스

Lily·2023년 10월 17일
0

TIL

목록 보기
6/21

Point_ 클래스

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;
  • norm(), dot(), ddot(), cross(), inside() 으로 연산 가능
  • 다양한 사칙연산에 대한 연산자 오버로딩과 std::cout 출력을 위한 << 연산자 오버로딩을 지원

Size_ 클래스

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;
  • 가로 세로 크기 정보를 표현
  • 멤버 변수: width, height
  • 멤버 함수: area()
  • 다양한 사칙연산에 대한 연산자 오버로딩과 std::cout 출력을 위한 << 연산자 오버로딩을 지원

Rect_ 클래스

template<typename _Tp> class Rect_
{
	public:
    	...
        _Tp x, y, width, height;
};

typedef Rect_<int>		Rect2i;
typedef Rect_<float>	Rect2f;
typedef Rect_<double>	Rect2d;
typedef Rect2i			Rect;
  • 2차원 사각형 표현을 위한 템플릿 클래스
  • 멤버 변수: x, y, width, height
  • 멤버 함수: tl(), br(), size(), area(), contains()
  • 다양한 사칙연산에 대한 연산자 오버로딩과 std::cout 출력을 위한 << 연산자 오버로딩을 지원

Rect, Size, Point 객체 간 연산

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 (20, 20)]
Rect rc6 = rc3 | rc4;			// rc6 = [80 x 60 from (0, 0)]

Range 클래스

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

String 클래스

// std::string을 가져다 씀
typedef std::string cv::String;

String str1 = "Hello";
String str2 = std::string("world");
String str3 = str1 + " " + str2;

Mat imgs[3];
// cv::format() 함수를 이용하여 형식 있는 문자열 생성 가능
// c언어의 printf() 함수와 인자 전달 방식이 유사함
for (int i = 0; i < 3; i++) {
	String filename = format("test%02d.bmp", i + 1);
    imgs[i] = imread(filename);
}

Vec 클래스

// Matx는 작은 크기의 행렬을 표현하는 클래스 (주로 16개 원소 이하)
template<typename _Tp, int m, int n> class Matx
{
	public:
    	...
        _Tp val[m*n];	// matrix elements
};

// Vec은 16개 이하의 원소를 갖는 열벡터, 2차원 열의 개수를 1로 둠
template<typename _Tp, int cn> class Vec : public Matx<_Tp, cn, 1>
{
	public:
    	...
        const _Tp& operator [](int i) const;
        _Tp& operator[](int i);
};
  • std::vector 와 유사한 구조
  • index i 로부터 바로 접근 가능
  • 주요 Vec 클래스 이름 재정의 : Vec< num-of-data >{b | s | w | i | f | d}
    • b: unsigned char
    • s: short
    • w: unsigned short
    • i: int
    • f: float
    • d: double
typedef Vec<uchar, 2> Vec2b;	// unsigned char
typedef Vec<uchar, 3> Vec3b;	// 컬러 영상에서 많이 사용함
typedef Vec<uchar, 4> Vec4b;

typedef Vec<int, 2> Vec2i;		// integer
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;	// float
typedef Vec<float, 3> Vec3f;
typedef Vec<float, 4> Vec4f;
typedef Vec<float, 6> Vec6f;

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

Scalar 클래스

// Scalar_: 원소 개수가 4개인 열벡터 (템플릿 클래스)
template<typename _Tp> class Scalar_ : public Vec<_Tp, 4>
{
	public:
    	Scalar_():
        Scalar_(_Tp v0, _Tp v1, _Tp v2=0, _Tp v3=0);
        Scalar_(_Tp v0);
        
        static Scalar_<_Tp> all(_Tp v0);
        ...
};

// 4개의 double형이 데이터를 갖는 자료형, 자주 사용됨
// (val[0], val[1], val[2], val[3])
typedef Scalar_<double> Scalar;
  • 크기가 4인 double 배열(double val[4])을 멤버 변수로 가지고 있는 클래스
  • 4채널 이하(Gray, BGR, BGR+Alpha)의 영상에서 픽셀 값을 표현하는 용도로 자주 사용
  • [] 연산자를 통해 원소에 접근 가능
  • Scalar 클래스 객체 생성과 원소 참조 방법 예시 코드:
Scalar gray = 128;
cout <<"gray: " << gray << endl; 		// gray: [128, 0, 0, 0]

Scalar yellow(0, 255, 255);
cout << "yellow: " << yellow << endl;	// yellow: [0, 255, 255, 0]

for (int i = 0; i < 4; i++)				// yellow.val[i] == yellow[i]
	cout << yellow.val[i] << ", " << yellow[i] << endl;

Mat 클래스

Mat 클래스의 깊이(depth)

  • 형식: CV_< bit-depth >{U | S | F}
#define CV_8U	0	// uchar, unsigned char
#define CV_8S	1	// schar, signed char
#define CV_16U	2	// ushort, unsigned short
#define CV_16S	3	// short
#define CV_32S	4	// int
#define CV_32F	5	// float
#define CV_64F	6	// double
#define CV_16F	7	// float16_t: 2byte 실수형, 딥러닝 때 활용

Mat 클래스의 타입(type)

  • 행렬의 깊이와 채널 수를 한꺼번에 나타내는 매크로 상수
  • Mat::type() 함수를 이용하여 참조
  • 형식: CV_8UC1 (unsigned 8bit, channel 1)
    • 컬러 영상의 경우는 CV_8UC3
    • 실수형일 경우, CV_32FC1

활용 예제 코드

Mat img = imread("lenna.bmp")

cout << "Width: " << img.cols << endl;			// Width: 512
cout << "Height: " << img.rows << endl;			// Height: 512
cout << "Channels: " << img.channels() << endl;	// 3

if (img.type() == CV_8UC1)
	cout << "Img is a grayscale image." << endl;
else if (img.type() == CV_8UC3)
	cout << "Img is a truecolor image." << endl;

// output: Img is a turecolor image.

InputArray 클래스

typedef const _InputArray& InputArray;
typedef InputArray InputArrayOfArrays;
  • Mat, Mat_<T>, Matx<T, m, n>, vector<T>,vector<vector<T>>, vector<Mat>, vector<Mat_<T>>, UMat, vector<UMat>, double
  • 위의 불규칙한 자료형들을 InputArray 형식으로 변환하여 Mat 연산을 가능하게 해주는 클래스

OutputArray 클래스

typedef const _OutputArray& OutputArray;
typedef OutputArray OutputArrayOfArrays;
  • 출력 과정에서 사용되는 클래스

  • _OutputArray 클래스는 _InputArray 클래스를 상속받아 만들어졌으며, 새로운 행렬을 생성하는 create()함수가 정의되어 있음

  • InputOutputArray의 경우는 입력이자 출력인 경우

References

  • 프로그래머스 자율주행 데브코스 황선규 강사님
profile
First Attempt In Learning

0개의 댓글