OpenCV 주요 클래스

Point_ 클래스

  • 2차원 점의 좌표 표현을 위한 탬플릿 클래스
    • 멤버 변수 : x, y
    • 멤버 함수 : dot(), ddot(), cross(), inside() 등
    • 다양한 사칙 연사에 대한 연산자 오버로딩과 std::cout 출력을 위한 «연산자 오버로딩을 지원

image

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 출력을 위한 « 연산자 오버로딩을 지원

image

Rect_ 클래스

  • 2차원 사각형 표현을 위한 템플릿 클래스
    • 멤버 변수 : x, y, width, height
    • 멤버 함수 : tl(), br(), size(), area(), contains()
    • 다양한 사칙 연산에 대한 연산자 오버로딩과 std::cout 출력을 위한 « 연산자 오버로딩을 지원

image

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)]

image

Range 클래스

  • 정수 값의 범위를 나타내기 위한 클래스

    • 멤버 변수 : start, end

    • 멤버 함수 : size(), empty(), all()

    • start는 범위에 포함되고, end는 범위에 포함되지 않음 : [start,end)

image

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 출력을 위한 « 연산자 오버로딩을 지원

image

  • Vec 클래스 이름 재정의

    • 자주 사용되는 자료형과 개수에 대한 Vec 클래스 탬플릿의 이름 재정의

    • 형식 : Vec <num-of-data> {b|s|w|i|f|d}

    • 주요 Vec 클래스 이름 재정의

      e.g. int 값 6개가 필요한 벡터는 Vec6i로 표현

      e.g. float 값 2개가 필요한 벡터는 Vec2f로 표현

image

Scalar 클래스

  • 크기가 4인 double 배열(double val[4])을 멤버 변수로 가지고 있는 클래스
  • 4채널 이하의 영상에서 픽셀 값을 표현하는 용도로 자주 사용
  • [] 연산자를 통해 원소에 접근 가능함

image

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;

image

Mat 클래스

  • n차원 1채널 또는 다채널 행렬 표현을 위한 클래스
    • 실수 또는 복소수 행렬, 그레이스케일 또는 트루컬러 영상, 벡터 필드 , 히스토그램, 텐서(tensor)등을 표현
  • 다양한 형태의 행렬 생성, 복사, 연산 기능을 제공
    • 행렬의 생성시 행렬의 크기, 자료형과 채널 수(타입), 초기값 등을 지정할 수 있음
    • 복사 생성자 & 대입 연산자는 얕은 복사 수행
    • 깊은 복사는 Mat::copyTo() 또는 Mat::clone() 함수 사용
    • 다양한 사칙 연산에 대한 연산자 오버로딩과 std::cout 출력을 위한 « 연산자 오버로딩을 지원
  • 행렬의 원소(픽셀 값) 접근 방법을 제공함
    • Mat::data 멤버 변수가 실제 픽셀 데이터의 위치를 가리킴
    • Mat::at(int y, int x) 또는 Mat::ptr(int y) 함수 사용을 권장

image

  • Mat 클래스의 깊이(depth)
    • 행렬 원소가 사용하는 자료형 정보를 가리키는 매크로 상수
    • Mat::depth 함수를 이용하여 참조
    • 형식 : CV_<bit-depth> {U|S|F}

image

  • 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;

image

image

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 함수에서 입력이자 출력을 사용되는 프록시 클래스