[2023-04-18] 3. OpenCV 주요 클래스
OpenCV 주요 클래스
Point_ 클래스
- 2차원 점의 좌표 표현을 위한 탬플릿 클래스
- 멤버 변수 : x, y
- 멤버 함수 : dot(), ddot(), cross(), inside() 등
- 다양한 사칙 연사에 대한 연산자 오버로딩과 std::cout 출력을 위한 «연산자 오버로딩을 지원
Point pt1, pt2(4,3), pt3(2,4); // pt1 = [0, 0]
int a = 2;
pt1 = pt2 + pt3; // pt1 = [6, 7]
pt1 = pt2 - pt3; // pt1 = [2, -1]
pt1 = pt3 * a; // pt1 = [4, 8]
pt1 = a * pt3; // pt1 = [4, 8]
pt1 = pt3 / a; // pt1 = [1, 2]
pt1 += pt2; // pt1 = [5, 5]
pt1 -= pt2; // pt1 = [1, 2]
pt1 *= a; // pt1 = [2, 4]
pt1 /= a; // pt1 = [1, 2]
double v = norm(pt2); // v = 5.0
bool b1 = pt1 == pt2; // b1 = false
bool b2 = pt1 != pt2; // b2 = true
cout << pt1 << endl; // "[1,2]" is printed
Size_ 클래스
- 영상 또는 사각형의 크기 표현을 위한 템플릿 클래스
- 멤버 변수 : width, height
- 멤버 함수 : area()
- 다양한 사칙 연산에 대한 연산자 오버로딩과 std::cout 출력을 위한 « 연산자 오버로딩을 지원
Rect_ 클래스
- 2차원 사각형 표현을 위한 템플릿 클래스
- 멤버 변수 : x, y, width, height
- 멤버 함수 : tl(), br(), size(), area(), contains()
- 다양한 사칙 연산에 대한 연산자 오버로딩과 std::cout 출력을 위한 « 연산자 오버로딩을 지원
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 클래스
-
정수 값의 범위를 나타내기 위한 클래스
-
멤버 변수 : start, end
-
멤버 함수 : size(), empty(), all()
-
start는 범위에 포함되고, end는 범위에 포함되지 않음 : [start,end)
-
String 클래스
- 원래 OpenCV에서 자체적으로 정의하여 사용하던 문자열 클래스였으나 OpenCV 4.x 버전부터 std:string 클래스로 대체됨
typedef std:string cv::String;
- cv::format() 함수를 이용하여 형식이 있는 문자열을 생성 가능하며 C언어의 printf()함수와 인자 전달 방식이 유사함
String str1 = "Hello";
String str2 = std::string("world");
String str3 = str1 + " " + str2;
Mat imgs[3];
for (int i =0; i<3; i++){
// format 함수를 이용해서 2개의 자릿수를 사용하고 만약 앞에 자릿수가 비어있으면 0으로 채우는 코드 작성
String filename = format("test%02d.bmp", i+1); // "test01.bmp", "test02.bmp", "test03.bmp"
imgs[i] = imread(filename);
}
Vec 클래스
- 벡터는 같은 자료형 원소 여러개로 구성된 데이터 형식
- Vec 클래스는 벡터를 표현하는 탬플릿 클래스
- std::cout 출력을 위한 « 연산자 오버로딩을 지원
-
Vec 클래스 이름 재정의
-
자주 사용되는 자료형과 개수에 대한 Vec 클래스 탬플릿의 이름 재정의
-
형식 :
Vec <num-of-data> {b|s|w|i|f|d}
-
주요 Vec 클래스 이름 재정의
e.g. int 값 6개가 필요한 벡터는 Vec6i로 표현
e.g. float 값 2개가 필요한 벡터는 Vec2f로 표현
-
Scalar 클래스
- 크기가 4인 double 배열(double val[4])을 멤버 변수로 가지고 있는 클래스
- 4채널 이하의 영상에서 픽셀 값을 표현하는 용도로 자주 사용
- [] 연산자를 통해 원소에 접근 가능함
Scalar gray = 128;
cout << "gray : " << gray << endl;
Scalar yellow (0, 255, 255);
cout << "yellow : " << yellow << endl;
for (int i=0; i<4; i++)
cout << yellow.val[i] << ", " << yellow[i] << endl;
Mat 클래스
- n차원 1채널 또는 다채널 행렬 표현을 위한 클래스
- 실수 또는 복소수 행렬, 그레이스케일 또는 트루컬러 영상, 벡터 필드 , 히스토그램, 텐서(tensor)등을 표현
- 다양한 형태의 행렬 생성, 복사, 연산 기능을 제공
- 행렬의 생성시 행렬의 크기, 자료형과 채널 수(타입), 초기값 등을 지정할 수 있음
- 복사 생성자 & 대입 연산자는 얕은 복사 수행
- 깊은 복사는 Mat::copyTo() 또는 Mat::clone() 함수 사용
- 다양한 사칙 연산에 대한 연산자 오버로딩과 std::cout 출력을 위한 « 연산자 오버로딩을 지원
- 행렬의 원소(픽셀 값) 접근 방법을 제공함
- Mat::data 멤버 변수가 실제 픽셀 데이터의 위치를 가리킴
- Mat::at
(int y, int x) 또는 Mat::ptr (int y) 함수 사용을 권장
- Mat 클래스의 깊이(depth)
- 행렬 원소가 사용하는 자료형 정보를 가리키는 매크로 상수
- Mat::depth 함수를 이용하여 참조
- 형식 :
CV_<bit-depth> {U|S|F}
-
Mat 클래스의 채널(channel)
- 원소가 하나 몇 개의 값으로 구성되어 있는가?
- Mat::channels() 함수를 이용하여 참조
e.g. 그레이스케일 영상은 픽셀 하나 당 밝기 값 1개 / 트루컬러 영상은 픽셀 하나 당 B, G, R 색상 성분 3개
-
Mat 클래스의 타입(type)
- 행렬의 깊이와 채널 수를 한꺼번에 나타내는 매크로 상수
- Mat::type() 함수를 이용하여 참조
- 형식 :
CV_8UC1
- 8U : uchar, unsigend char
- C1 : 채널수 1개
- 형식 :
CV_8UC3
- 8U : uchar, unsigend char
- C3 : 채널 수 3개
Mat img = imread("lenna.bmp");
cout << "Width: " << img.cols <<endl;
cout << "Height: " << img.rows << endl;
cout << "Channels: " <<img.channels << endl;
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;
InputArray와 OutputArray 클래스
InputArray
- 주로 Mat 클래스를 대체하는 프록시 클래스(proxy class)로 OpenCV 함수에서 입력 인자로 사용
typedef const _InputArray& InputArray;
typedef InputArray InputArrayofArrays;
- 사용자가 명시적으로 _InputArray 클래스의 인스턴스 또는 변수를 생성하여 사용하는 것을 금지
OutputArray
- OpenCV 함수에서 출력 인자로 사용되는 프록시 클래스
typedef const _OutputArray& OutputArray;
typedef OutputArray OutputArrayOfArrays;
InputOutputArray
- OpenCV 함수에서 입력이자 출력을 사용되는 프록시 클래스