OpenCV는 컴퓨터 비전을 보다 쉽고 직관적으로 처리할 수 있도록 매우 다양한 데이터 타입을 정의하고 있습니다. 또한 Template을 이용하여 라이브러리의 확장성을 높였습니다. 이번 포스팅에서는 기본적인 데이터 유형에 대해 살펴보도록 하겠습니다.
1) cv::Point_<자료형>
2차원 상의 좌표(x, y)를 저장하기 위한 템플릿 클래스입니다. 실제 사용할 때, cv::Point_<int>, cv::Point_<float> 등으로 자료형을 명시해주어야 합니다. 자주 쓰이는 자료형은 다음과 같이 미리 재정의가 되어 있습니다.
– cv::Point_<int> = cv::Point2i = cv::Point
– cv::Point_<float> = cv::Point2f
– cv::Point_<double> = cv::Point2d
객체의 사용법은 아래와 같습니다. 생성자 및 연산자 재정의가 잘 되어있어 매우 직관적입니다.
// 기본 생성자로 Point 객체 생성 후, 좌표값 설정
cv::Point pt1;
pt1.x = 1; pt1.y = 2;
// 객체 생성 시 좌표값 설정
cv::Point pt2(3, 4);
// 객체 간 덧셈 후, 새로운 객체 생성
cv::Point pt3 = pt1 + pt2;
// 객체 간 사칙연산 가능
pt1 += pt2;
// 객체 간 비교연산 가능
pt1 == pt2;
2) cv::Point3_<자료형>
3차원 상의 좌표(x, y, z)를 저장하기 위한 템플릿 클래스입니다. cv::Point_ 클래스와 마찬가지로 사용 시, cv::Point3_<int>, cv::Point3_<float> 등으로 자료형을 명시해주어야 하며, 자주 쓰이는 자료형은 미리 재정의가 되어 있습니다.
– cv::Point3_<int> = cv::Point3i
– cv::Point3_<float> = cv::Point3f
– cv::Point3_<double> = cv::Point3d
3) cv::Size_<자료형>
영상의 크기(너비와 높이) 를 저장하기 위한 용도입니다. 미리 재정의된 자료형은 아래와 같습니다.
– cv::Size_<int> = cv::Size2i = cv::Size
– cv::Size_<float> = cv::Size2f
객체의 사용법은 아래와 같습니다.
// 기본 생성자로 Size 객체 생성 후, 너비와 높이 설정
cv::Size size1;
size1.width = 10; size1.height=20;
// 객체 생성 시점에서 너비와 높이 설정
cv::Size size2(30, 40);
// 객체 간 덧셈 및 곱셈 연산 후, 새로운 객체 생성
cv::Size size3 = (size1 + size2) * 2;
// 영역의 크기 연산 (width*height)
int area = size1.area();
// 영역의 비율 연산 (width/height)
double aspectRatio = size1.aspectRatio();
4) cv::Rect_<자료형>
사각형 시작 좌표 및 영역을 표현하기 위한 용도로, 좌표(point)와 너비/높이(size)를 가지고 있습니다. 미리 재정의된 자료형은 아래와 같습니다.
– cv::Rect_<int> = cv::Rect2i = cv::Rect
– cv::Rect_<float> = cv::Rect2f
– cv::Rect_<double> = cv::Rect2d
객체의 사용법은 아래와 같습니다.
// 객체 생성 후, 시작 좌표 및 영역 크기 대입
cv::Rect rect1;
rect1.x = 1; rect1.y=3; rect1.width=30; rect2.height=20;
// 객체 생성 시점에서 시작 좌표 및 영역 크기 대입
cv::Rect rect2(5, 10, 60, 40);
// Point 객체로 Rect 객체 생성
cv::Point pt1(2, 2);
cv::Point pt2(12, 12);
cv::Rect rect3(pt1, pt2);
// Point와 Size 객체로 Rect 객체 생성
cv::Size size1(10, 10);
cv::Rect rect4(pt, size1);
// 객체 간 더하여 새로운 객체 생성
cv::Rect rect5 = rect1+rect4;
// 두 객체의 좌표 및 영역이 같은지 체크
bool b1 = rect3 == rect4;
// 사각형 영역 내 좌표가 존재하는지 확인
cv::Point pt3(20, 25);
bool b2 = rect2.contains(pt3);
5) cv::Vec< 자료형, 원소의 개수 >
고정 벡터 클래스로, 크기가 작은 벡터를 위한 용도입니다. 벡터가 저장할 원소의 개수를 컴파일 타임에 알고 있어야 합니다. 인덱스 연산자[] 가 오버로딩 되어 있으므로, 배열과 동일한 방식으로 특정 원소에 접근할 수 있습니다. 자주 쓰이는 일부 형태는 재정의 되어 있습니다. (b = uchar, s = short, w = ushort, i = int, f = float, d = double)
– cv::Vec<uchar, 3> = cv::Vec3b
– cv::Vec<short, 3> = cv::Vec3s
– cv::vec<ushort, 3> = cv::Vec3w
– cv::Vec<int, 2> = cv::Vec2i
– cv::Vec<float, 4> = cv::Vec4f
– cv::Vec<double, 6> = cv::Vec6d
6) cv::Scalar_<자료형>
4개의 원소를 갖고 있는 벡터로, RGBA 값을 저장하는 용도로 주로 사용됩니다. 내부적으로는 바로 위에서 소개해 드린 고정 벡터 클래스 (cv::Vec<자료형, 4>)와 같습니다.
– cv::Scalar_<int> = cv::Vec<int, 4>
– cv::Scalar_<double> = cv::Scalar
7) cv::Range
범위 및 구간을 표현하는 클래스 입니다. 범위의 시작(Start)과 끝(End)을 의미하는 integer 변수로 범위를 표현합니다. 시작(Start)은 범위에 포함되지만, 끝(End)은 범위에 포함되지 않습니다.
// range 객체 생성
cv::Range range(1, 10);
// 범위 출력: 0~9
range.size(); // 9
8) cv::Matx< 자료형, row, col >
고정 행렬 클래스로 크기가 작은 행렬을 위한 용도입니다. 고정 행렬이므로 컴파일 타임에 행렬의 크기를 알고 있어야 합니다. cv::Matx<float, 3, 3> 으로 표현하며, 자주 쓰이는 형태는 미리 재정의가 되어 있어서 cv::Matx33f 의 형태로도 표현할 수 있습니다.단, typedef로 정의된 Matx의 데이터 타입은 float형과 double형으로 한정됩니다. Mat class에 대한 자세한 소개는 따로 올리도록 하겠습니다.