3장 OpenCV 주요 클래스

3.1 기본 자료형 클래스

3.1.1 Point_ 클래스

OpenCV에서 제공하는 여러 자료형 클래스 중에서 먼저 Point 클래스에 대해 알아보겠습니다. Point 클래스는 2차원 평면 위에 있는 점의 좌표를 표현하는 템플릿 클래스입니다.1 Point 클래스는 2차원 좌표를 나타내는 x와 y라는 이름의 멤버 변수를 가지고 있습니다.

다양한 자료형에 대한 Point 클래스 이름 재정의입니다.
    typedef Point<int>    Point2i;
    typedef Point<int64>  Point2l;
    typedef Point<float>  Point2f;
    typedef Point_<double> Point2d;
    typedef Point2i        Point;

Point_ 클래스는 템플릿 클래스이기 때문에 실제로 사용할 때에는 어떤 자료형으로 좌표를 표현할 것인지를 명시해야 합니다

Point_ 클래스를 사용하는 코드 작성 방법에 대해 알아보겠습니다. 2차원 정수 좌표계에서 점의 좌표를 표현하려면 다음과 같이 코드를 작성할 수 있습니다.

Point pt1;              // pt1 = (0, 0)
pt1.x = 5; pt1.y = 10;  // pt1 = (5, 10)
Point pt2(10, 30);      // pt2 = (10, 30)
이 코드에서 변수 pt1은 기본 생성자를 사용하여 생성되었으며, 이 경우 멤버 변수 pt1.x와 pt1.y는 0으로 초기화됩니다. 그러므로 기본 생성자로 생성된 변수 pt1은 (0, 0) 좌표를 나타냅니다. 앞 코드의 두 번째 행에서는 pt1.x에 5를 대입하고, pt1.y에는 10을 대입함으로써 pt1 변수가 (5, 10) 좌표를 나타내도록 변경했습니다. 변수 pt2는 생성과 동시에 (10, 30) 좌표를 나타냅니다.

3.1.2 Size_ 클래스

영상 또는 사각형 영역의 크기를 표현할 때에는 Size 클래스를 사용합니다. Size 클래스는 사각형 영역의 가로와 세로 크기를 나타내는 width와 height 멤버 변수를 가지고 있습니다.

다양한 자료형에 대한 Size 클래스 이름 재정의입니다.
    typedef Size<int>    Size2i;
    typedef Size<int64>  Size2l;
    typedef Size<float>  Size2f;
    typedef Size_<double> Size2d;
    typedef Size2i        Size;

Point 클래스와 마찬가지로 Size 클래스도 템플릿으로 정의되어 있으며, 다양한 자료형에 대해 이름이 재정의되어 있습니다.

Size 클래스를 사용하는 코드 작성 방법에 대해 알아보겠습니다. 2차원 정수 좌표계에서 크기를 표현하려면 다음과 같이 코드를 작성할 수 있습니다.

Size sz1, sz2(10, 20);           // sz1 = [0 x 0], sz2 = [10 x 20]
sz1.width = 5; sz1.height = 10;  // sz1 = [5 x 10]
이 코드에서 오른쪽 주석으로 표시된 부분은 연산에 의해 생성되는 Size 객체의 크기를 나타냅니다. 변수 sz1은 기본 생성자를 사용하여 생성하였으며, 이 경우 멤버 변수 sz1.width와 sz1.height는 0으로 초기화됩니다. 그러므로 기본 생성자로 생성된 변수 sz1은 0×0의 크기를 나타내고, 이는 유효하지 않은 크기 객체입니다. 변수 sz2는 생성과 동시에 10×20의 크기를 나타냅니다. 앞 코드의 두 번째 행에서는 sz1.width에 5를 대입하고, sz1.height에는 10을 대입함으로써 5×10의 크기를 나타내도록 변경했습니다.

3.1.3 Rect_ 클래스

OpenCV에서 사각형의 위치와 크기 정보를 표현할 때에는 Rect 클래스를 사용합니다. Rect 클래스는 사각형의 좌측 상단 점의 좌표를 나타내는 x, y 멤버 변수와 사각형의 가로 및 세로 크기를 나타내는 width, height 멤버 변수를 가지고 있습니다.

다양한 자료형에 대하여 Rect_ 클래스 이름 재정의입니다.
    typedef Rect<int>    Rect2i;
    typedef Rect<float>  Rect2f;
    typedef Rect<double> Rect2d;
    typedef Rect2i        Rect;

Rect_ 클래스도 템플릿으로 정의되어 있으며, 다양한 자료형에 대해 이름이 재정의되어 있습니다. int 자료형을 이용하여 사각형 정보를 표현하려면 Rect2i 클래스를 사용하고, float 자료형으로 사각형을 표현하려면 Rect2f 클래스를 사용합니다. 특히 정수형으로 사각형 정보를 표현하는 경우가 많기 때문에 Rect2i는 다시 Rect라는 이름으로 재정의되어 있습니다. 즉, Rect 클래스는 정수형 멤버 변수 x, y, width, height를 가지고 있는 사각형 표현 클래스입니다.

3.1.4 RotatedRect 클래스

RotatedRect 클래스는 회전된 사각형을 표현하는 클래스입니다. RotatedRect 클래스는 회전된 사각형의 중심 좌표를 나타내는 center, 사각형의 가로 및 세로 크기를 나타내는 size, 회전 각도 정보를 나타내는 angle을 멤버 변수로 가집니다.

 

RotatedRect 클래스를 사용하는 코드 작성 방법에 대해 알아보겠습니다. 중심 좌표가 (40, 30), 크기는 40×20, 시계 방향으로 30°만큼 회전된 사각형 객체는 다음 코드를 이용하여 생성할 수 있습니다.

 

RotatedRect rr1(Point2f(40, 30), Size2f(40, 20), 30.f);

 

만약 회전된 사각형 객체의 네 꼭지점 좌표를 알고 싶다면 RotatedRect::points() 멤버 함수를 사용합니다. RotatedRect::points() 함수에는 크기가 4인 Point2f 자료형의 배열 이름을 전달합니다.Point2f pts[4]; rr1.points(pts);

이 코드를 실행하면 회전된 사각형의 네 꼭지점 좌표가 pts 배열에 저장됩니다. 실제로 코드를 실행하면 pts[0] = (17.6795, 28.6603), pts[1] = (27.6795, 11.3397), pts[2] = (62.3205, 31.3397), pts[3] = (52.3205, 48.6603) 형태로 좌표가 설정됩니다. RotatedRect::points() 함수는 사각형의 좌측 하단 꼭지점부터 시계 방향으로 꼭지점 좌표를 추출합니다.

 

경우에 따라서는 회전된 사각형을 감싸는 최소 크기의 사각형 정보가 필요합니다. 이처럼 특정 객체를 감싸는 최소 크기의 사각형을 바운딩 박스(bounding box)라고 합니다. 회전된 사각형의 바운딩 박스를 구하려면 RotatedRect::boundingRect() 멤버 함수를 사용합니다.Rect br = rr1.boundingRect();


3.1.5 Range 클래스

 

Range 클래스는 범위 또는 구간을 표현하는 클래스입니다. Range 클래스는 범위의 시작과 끝을 나타내는 start end 멤버 변수를 가지고 있습니다. 

 


3.1.6 String 클래스

 

OpenCV에서는 영상 출력 창에 고유의 문자열을 지정하여 구분하고, 영상에 문자열을 출력하는 기능도 제공합니다. C++ 표준 라이브러리(STL)에서 std::string 클래스를 이용하여 문자열을 저장하고 처리하듯이 OpenCV에서는 cv::String 클래스를 사용하여 문자열을 저장하고 처리할 수 있습니다.

 


3.2 Mat 클래스

 

OpenCV에서 가장 많이 사용하는 클래스는 행렬을 나타내는 Mat 클래스입니다. 그러므로 OpenCV 라이브러리를 잘 다루기 위해서는 Mat 클래스를 제대로 이해하고 있어야 합니다.


3.2.1 Mat 클래스 개요

 

OpenCV 라이브러리에서 가장 많이 사용하는 클래스는 단연 행렬을 표현하는 Mat 클래스입니다. Mat 클래스는 일반적인 2차원 행렬뿐만 아니라 고차원 행렬을 표현할 수 있으며, 한 개 이상의 채널(channel)을 가질 수 있습니다. Mat 클래스에는 정수, 실수, 복소수 등으로 구성된 행렬 또는 벡터(vector)를 저장할 수 있고, 그레이스케일 또는 컬러 영상을 저장할 수도 있습니다.

 

Mat 클래스는 <opencv-src>\modules\core\include\opencv2\core\mat.hpp 파일에 정의되어 있습니다. 여기서 <opencv-src>는 OpenCV 소스 코드가 있는 폴더 위치를 의미합니다.

 

 

#define CV_8U   0    // uchar, unsigned char
#define CV_8S   1    // schar, signed char
#define CV_16U  2    // ushort, unsigned short
#define CV_16S  3    // signed short
#define CV_32S  4    // int
#define CV_32F  5    // float
#define CV_64F  6    // double
#define CV_16F  7    // float16_t

 


3.2.2 행렬의 생성과 초기화

 

Mat 객체를 생성함과 동시에 원소 값 저장을 위한 메모리 공간을 할당하려면 다음 생성자를 사용합니다.

 

 

Mat img2(480, 640, CV_8UC1); // unsigned char, 1-channel

Mat img3(480, 640, CV_8UC3); // unsigned char, 3-channels

 

Mat 클래스 생성자에서 행렬의 크기를 지정할 때 Size 클래스를 사용할 수도 있습니다.

Mat img4(Size(640, 480), CV_8UC3); // Size(width, height)

 

정해진 크기와 타입의 Mat 객체를 생성하고 모든 원소 값을 초기화하려면 다음 형태의 생성자를 사용합니다.

Mat img5(480, 640, CV_8UC1, Scalar(128));          // initial values, 128
Mat img6(480, 640, CV_8UC3, Scalar(0, 0, 255));    // initial values, red

 

OpenCV에서 모든 원소가 0으로 초기화된 행렬을 만드는 함수 이름은 Mat::zeros()입니다.

Mat mat1 = Mat::zeros(3, 3, CV_32SC1); // 0s matrix

 

행렬의 모든 원소가 1로 초기화된 행렬을 생성하려면 Mat::ones() 함수를 사용할 수 있습니다. 또한 행렬 연산에서 자주 사용되는 단위 행렬(identity matrix)을 생성하려면 Mat::eye() 함수를 사용할 수 있습니다. Mat::ones() Mat::eye() 함수 원형은 다음과 같습니다.

 

Mat mat2 = Mat::ones(3, 3, CV_32FC1); // 1s matrix 

Mat mat3 = Mat::eye(3, 3, CV_32FC1); // identity matrix


3.2.3 행렬의 복사

 

Mat img2 = img1; // 복사 생성자(얕은 복사)

Mat img3; img3 = img1; // 대입 연산자(얕은 복사)

 

만약 복사본 영상을 새로 생성할 때, 픽셀 데이터를 공유하는 것이 아니라 메모리 공간을 새로 할당하여 픽셀 데이터 전체를 복사하고 싶다면 Mat::clone() 또는 Mat::copyTo() 함수를 사용해야 합니다.

 

Mat img4 = img1.clone(); // 깊은 복사

Mat img5; img1.copyTo(img5); // 깊은 복사

 


3.2.4 부분 행렬 추출

 

Mat 클래스로 정의된 행렬에서 특정 사각형 영역의 부분 행렬을 추출하고 싶을 때에는 Mat 클래스에 정의된 괄호 연산자 재정의를 사용합니다.

 

Mat img1 = imread(“cat.bmp”);

Mat img2 = img1(Rect(220, 120, 340, 240)); // 얕은복사

 

영상의 반전은 Mat 클래스 타입의 변수 앞에 ~ 연산자를 붙이는 방식으로 쉽게 적용할 수 있습니다.

img2 = ~img2;

 

만약 독립된 메모리 영역을 확보하여 부분 영상을 추출하고자 한다면 괄호 연산자 뒤에 Mat::clone() 함수를 함께 사용해야 합니다. 즉, Mat 클래스의 괄호 연산자 재정의 함수를 사용한 후, 바로 뒤에 .clone() 코드를 붙여서 사용하면 독립된 복사본의 부분 영상을 만들 수 있습니다. 다음은 실제 코드 사용 예입니다.

 

Mat img3 = img1(Rect(220, 120, 340, 240)).clone();

 

Mat 행렬에서 특정 범위의 행 또는 열을 부분 행렬로 추출하고자 할 때에는 Mat::rowRange() 또는 Mat::colRange() 함수를 사용할 수 있습니다. Mat::rowRange() 함수는 지정한 범위의 행으로 구성된 행렬을 반환하고, Mat::colRange() 함수는 지정한 범위의 열로 구성된 행렬을 반환합니다. 행 또는 열의 범위는 두 개의 int 값으로 지정할 수도 있고, 또는 Range 클래스 객체를 이용하여 지정할 수 있습니다.

 


3.2.5 행렬의 원소 값 참조

 

OpenCV에서 제공하는 기능 외에 사용자가 직접 자신만의 알고리즘을 구현하여 적용해야 하는 경우도 자주 발생합니다. 이때 필요한 기능이 영상의 픽셀 값을 참조하는 기능입니다. OpenCV는 Mat 클래스에 저장된 행렬 원소 값을 참조하고 값을 변경할 수 있는 다양한 인터페이스를 제공합니다. 이 절에서는 OpenCV에서 제공하는 세 가지 픽셀 값 접근 방법에 대해 알아보고, 각 방법의 장단점에 대해 살펴보겠습니다.

 

Mat::at( ) 함수 사용 방법

 

OpenCV에서 제공하는 가장 직관적인 행렬 원소 접근 방법은 Mat::at() 멤버 함수를 사용하는 방법입니다. Mat::at() 함수는 보통 행과 열을 나타내는 두 개의 정수를 인자로 받아 해당 위치의 행렬 원소 값을 참조 형식으로 반환합니다. Mat::at() 함수는 템플릿을 사용하는 템플릿 함수로서 여러 가지 형태로 재정의가 되어 있으며, 주로 사용하는 Mat::at() 함수 형식은 다음과 같습니다.

 

Mat::at() 함수는 템플릿 함수로 정의되어 있기 때문에 Mat::at() 함수를 사용할 때에는 행렬 원소 자료형을 명시적으로 지정해야 합니다.

for (int j = 0; j < mat1.rows; j++) {
  for (int i = 0; i < mat1.cols; i++) {
      mat1.at<uchar>(j, i)++;
  }
}

 

 

Mat::ptr( ) 함수 사용 방법

 

두 번째로 살펴볼 행렬 원소 접근 방법은 Mat::ptr() 멤버 함수를 이용하는 방법입니다. Mat::ptr() 함수는 Mat 행렬에서 특정 행의 첫 번째 원소 주소를 반환합니다. Mat::ptr() 함수는 여러 가지 형식으로 재정의되어 있지만, 가장 널리 사용하는 Mat::ptr() 함수 형식은 다음과 같습니다.

 

for (int j = 0; j < mat1.rows; j++) {
  uchar p = mat1.ptr<uchar>(j);
  for (int i = 0; i < mat1.cols; i++) {
      p[i]++;
  }

 

MatIterator_ 반복자 사용 방법

 

앞서 설명한 Mat::at() 또는 Mat::ptr() 함수를 사용하여 행렬의 원소를 참조할 경우, 함수 인자로 전달된 값이 행렬의 크기를 벗어나면 에러가 발생합니다. 그러므로 프로그램 코드를 작성할 때 사용자가 행렬 또는 영상의 크기를 충분히 고려해야 하며, 주의하지 않으면 예기치 않게 프로그램이 종료될 수 있습니다. 이러한 단점을 해소하기 위해 OpenCV는 반복자(iterator) 개념을 도입하여 행렬 원소를 참조할 수 있는 방법을 제공합니다. 즉, Mat 행렬 원소 참조를 위한 반복자 변수를 만들어서 행렬 크기에 상관없이 행렬 전체 원소를 차례대로 참조하는 방식입니다.

 

for (MatIterator_<uchar> it = mat1.begin<uchar>(); it != mat1.end<uchar>(); ++it) {
  (*it)++;
}


3.2.6 행렬 정보 참조하기


3.2.7 행렬 연산

표 3-3에 나열된 행렬 연산 예제 중에서 * 연산자를 사용하는 곱셈 연산은 행렬의 수학적 곱셈 연산을 의미합니다. 만약 두 행렬에서 같은 위치에 있는 원소끼리 곱셈 연산을 수행하려면 Mat::mul() 멤버 함수를 사용해야 합니다. Mat::mul() 함수 원형은 다음과 같습니다.

 

 

행렬과 관련된 중요한 연산 중에 역행렬(inverse matrix)을 구하는 연산이 있습니다. OpenCV에서 행렬의 역행렬을 구할 때에는 Mat::inv() 멤버 함수를 사용합니다. Mat::inv() 함수 원형은 다음과 같습니다.

행렬의 행과 열을 서로 교환해서 만드는 전치 행렬(transpose matrix) Mat::t() 멤버 함수를 이용하여 구할 수 있습니다. Mat::t() 함수 원형은 다음과 같습니다.


3.2.8 크기 및 타입 변환 함수

 

행렬의 타입을 변경할 때에는 Mat::convertTo() 함수를 사용합니다. Mat::convertTo() 함수 원형은 다음과 같습니다.

Mat::reshape() 함수는 주어진 행렬의 크기 또는 채널 수를 변경합니다. Mat::reshape() 멤버 함수는 다양한 형식으로 재정의되어 있으며, 그중 널리 사용되는 형식은 다음과 같습니다.

 

다음은 Mat::reshape() 함수를 이용하여 3×4 크기의 행렬을 1×12 크기의 행렬로 변환하는 예제 코드입니다.

uchar data1[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
Mat mat1(3, 4, CV_8UC1, data1);
Mat mat2 = mat1.reshape(0, 1);

 

Mat::reshape() 멤버 함수처럼 행렬의 모양을 변경시키는 것이 아니라 단순히 행렬의 행 크기를 변경하고 싶을 때에는 Mat::resize() 함수를 사용할 수 있습니다.

 

이미 존재하는 행렬에 원소 데이터를 추가하고 싶을 때에는 Mat::push_back() 멤버 함수를 사용할 수 있습니다. Mat::push_back() 함수는 다음과 같이 다양한 형식으로 정의되어 있습니다.

 


3.3 Vec과 Scalar 클래스


3.3.1 Vec 클래스

 

하나의 행으로만 이루어진 행렬은 행 벡터라고 부르고, 하나의 열로만 구성된 행렬은 열 벡터라고 부릅니다. 그리고 행 벡터와 열 벡터를 합쳐서 벡터 또는 벡터 행렬이라고 부릅니다. 즉, 벡터는 같은 자료형을 가진 원소 몇 개로 구성된 데이터 형식이라고 볼 수 있습니다.

 

코드 3-14에서 Matx 클래스는 작은 크기의 행렬을 표현하기 위해 만들어진 템플릿 클래스입니다. 이 행렬 클래스는 원소 데이터를 val이라는 이름의 배열에 저장합니다. 코드 3-14의 1행에서 _Tp는 행렬 원소 자료형이고, m n은 각각 행과 열 개수를 의미합니다. Vec 클래스는 Matx 클래스를 상속받아 만들어지며, 열 개수가 1개로 특화된 벡터 표현 클래스입니다. Vec 클래스도 템플릿을 사용하기 때문에 실제 코드에서 사용할 때에는 <> 괄호 사이에 데이터 자료형과 데이터 개수를 명시해야 합니다.

 

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;

 

예를 들어 컬러 영상의 픽셀 값을 표현하고 싶을 때는 Vec<uchar, 3> 형식 대신에 Vec3b 클래스를 사용할 수 있습니다. Vec3b 클래스를 사용하면 앞에서 설명한 p1, p2 변수 선언을 다음과 같이 작성할 수 있습니다.

 

그런데 Vec 클래스는 다음과 같이 [] 연산자 재정의가 되어 있기 때문에 [] 연산자를 이용하여 멤버 변수 val 배열에 쉽게 접근할 수 있습니다.

template<typename _Tp, int cn> inline
_Tp& Vec<_Tp, cn>::operator [](int i)
{
  CV_DbgAssert( (unsigned)i < (unsigned)cn );
  return this->val[i];
}
이 코드에서 CV_DbgAssert() 매크로 함수는 디버그 모드에서만 동작하는 예외 처리 코드이며, 동작 성능을 고려하여 릴리스 모드에서는 무시됩니다. [] 연산자 재정의를 이용하여 p1 변수의 첫 번째 원소를 100으로 변경하려면 다음과 같이 코드를 작성합니다.

p1[0] = 100;


3.3.2 Scalar 클래스

 

OpenCV 프로그래밍에서 Mat 클래스 다음으로 자주 사용되는 클래스는 Scalar 클래스입니다. Scalar 클래스는 4채널 이하의 영상에서 픽셀 값을 표현하는 용도로 자주 사용됩니다. 사실 Scalar 클래스는 Scalar라는 이름의 클래스 템플릿 이름 재정의이며, Scalar 클래스는 Vec 클래스를 상속받아 만들어졌습니다. 코드 3-15는 간략화한 Scalar_ 클래스와 Scalar 이름 재정의를 보여 줍니다.

 

Scalar 클래스는 보통 네 개 이하의 채널을 갖는 영상의 픽셀 값을 표현하는 용도로 사용됩니다. 그레이스케일 영상의 경우, Scalar 클래스의 첫 번째 원소가 픽셀 밝기를 표현하고 나머지 세 개의 원소는 0으로 설정됩니다. 트루컬러 영상의 경우, Scalar 클래스의 처음 세 개 원소가 B(파란색), G(녹색), R(빨간색) 색상 성분 값을 표현하고, 네 번째 원소는 보통 0으로 설정됩니다. 간혹 PNG 파일 형식처럼 투명도를 표현하는 알파 채널이 있는 경우 Scalar 클래스의 네 번째 원소를 이용하기도 합니다. 자주 사용되는 Scalar 클래스 객체 생성 방법을 정리하면 다음과 같습니다.

Scalar(밝기)
Scalar(파란색, 녹색, 빨간색)
Scalar(파란색, 녹색, 빨간색, 투명도)

 


3.4 InputArray와 OutputArray 클래스

 

InputArray 클래스는 주로 OpenCV 함수의 입력으로 사용되고, OutputArray 클래스는 OpenCV 함수의 출력으로 사용되는 인터페이스 클래스입니다.


3.4.1 InputArray 클래스

 

OpenCV 문서 사이트를 보면 InputArray 타입의 인자를 사용하는 함수를 자주 볼 수 있습니다. 영상의 화면 출력 함수인 imshow() 함수도 영상을 InputArray 타입으로 전달하도록 선언되어 있습니다. InputArray 클래스는 Mat, vector<T> 등 다양한 타입을 표현할 수 있는 인터페이스 클래스로서 주로 OpenCV 함수의 입력 인자 자료형으로 사용됩니다.

 

InputArray 클래스는 다음과 같은 형태로 이름 재정의되어 있습니다.

 

typedef const _InputArray& InputArray;

 

만약 OpenCV에서 제공하는 함수처럼 사용자 정의 함수에서 Mat 객체뿐만 아니라 vector<T> 타입의 객체를 한꺼번에 전달받을 수 있게 만들고 싶다면 사용자 정의 함수 인자에 InputArray 타입을 사용할 수 있습니다. 그리고 실제 함수 본문에서는 _InputArray 클래스의 멤버 함수인 _InputArray::getMat() 함수를 사용하여 Mat 객체 타입 형태로 변환해서 사용해야 합니다.

 

코드 3-17은 InputArray 클래스 타입의 인자를 사용하는 함수를 정의하는 방법과 실제 사용 방법을 보여 주는 예제 코드입니다. 코드 3-17에 나온 InputArrayOp() 함수와 printMat() 함수를 사용하는 전체 코드는 내려받은 예제 파일에서 ch03/InputArrayOp 프로젝트에서 확인할 수 있습니다.

 

 


3.4.2 OutputArray 클래스

많은 OpenCV 함수는 영상을 입력으로 받아 영상 처리를 수행하고, 그 결과를 다시 영상으로 생성하여 반환합니다. 이때 출력 영상을 함수의 return 구문으로 반환하는 것이 아니라 보통 OutputArray 클래스의 참조를 함수 인자로 사용하여 결과 영상을 전달합니다. OutputArray 클래스는 다음과 같이 이름 재정의가 되어 있습니다.

typedef const _OutputArray& OutputArray;

Posted by pi92

블로그 이미지
pi92

공지사항

Yesterday
Today
Total

달력

 « |  » 2025.12
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31

최근에 올라온 글

최근에 달린 댓글

글 보관함