메뉴 닫기

OpenCV 데이터 타입 소개

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에 대한 자세한 소개는 따로 올리도록 하겠습니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다