1 minute read



2.3.1 Vec Class


Vec 클래스는 행 벡터와 열 벡터를 표현한다. 작은 크기의 행렬을 표현하는 Matx 클래스를 상속받아 만들어지며, 열 개수가 1개로 특화된 벡터 표현 클래스이다.

Vec 클래스 역시 템플릿을 받아 사용하므로 실제 코드를 사용할 때는 데이터 자료형과 데이터 개수를 명시해야 한다.

uchar 자료형 세 개를 갖는 벡터의 경우 Vec<uchar, 3> 형식으로 사용한다. 이 형식은 3채널 컬러 영상의 픽셀 값을 표현할 때 주로 사용.

Vec<uchar, 3> p1(0, 0, 255);


Vec 클래스 템플릿 이름 재정의

매번 저렇게 입력하는 건 불편하다.

Vec<num-of-data>{b|s|w|i|f|d}
---
 - num-of-data : 2, 3, 4  작은 숫자 지정
 - b : uchar
 - s : short
 - w : ushort
 - i : int
 - f : float
 - d : double

실제로 OpenCV에 정의된 Vec 클래스의 이름 재정의들.

typedef Vec<uchar, 2> Vec2b;
typedef Vec<uchar, 3> Vec3b;
typedef Vec<uchar, 4> Vec4b;

typedef Vec<short, 2> Vec2s;
typedef Vec<short, 3> Vec3s;
typedef Vec<short, 4> Vec4s;

typedef Vec<ushort, 2> Vec2w;
typedef Vec<ushort, 3> Vec3w;
typedef Vec<ushort, 4> Vec4w;

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

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


벡터 원소 접근

Vec3b p1, p2(0, 0, 255);

위 코드는 p1, p2 벡터 변수를 선언. 이들은 각각 uchar val[3];형식의 멤버 변수를 갖게 된다. p1의 경우는 p1.val 배열 원소가 모두 0으로 초기화되었고, p2의 경우 p2.val[0]p2.val[1]은 0으로, p2.val[2]는 255로 초기화된다.

p1 변수의 첫 번째 원소를 100으로 변경하고 싶다면

p1.val[0] = 100;


그런데 Vec 클래스는 [] 연산자 재정의가 되어 있으므로 멤버 변수 val 배열에 쉽게 접근할 수 있다. 그러므로,

p1[0] = 100;


물론 Vec 클래스도 std::cout<< 연산자로 출력 가능.



2.3.2 Scalar 클래스


Scalar 클래스는 4채널 이하의 영상에서 픽셀 값을 표현할 때 주로 사용된다. Vec 클래스를 상속받아 만들어진 Scalar_ 클래스에서 double 자료형을 사용할 때의 템플릿 이름 재정의이다. 즉 크기가 4인 double형 배열 val을 멤버 변수로 갖고 있는 자료형이라고 생각하면 된다.


그레이스케일 영상의 경우 첫 번째 성분이 픽셀 밝기를 표현, 나머지 세 성분은 0이다.

트루컬러 영상의 경우 처음 세 원소가 B, G, R 색상 성분 값을 표현하고 나머지 네 번째 원소는 보통 0이다. PNG 파일처럼 투명도를 표현하는 알파 채널이 있다면 네 번째 원소를 사용한다.


마찬가지로 [] 연산자 재정의가 되어 있으며, std::cout<< 연산자로 원소를 출력할 수 있다.