2.3 Vec
, Scalar
Class
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
과 <<
연산자로 원소를 출력할 수 있다.