1 minute read



2.4.1 InputArray Class


imshow() 함수의 인자는 InputArray 타입이었던 것을 생각해 보자. InputArray 클래스는 Mat, vector<T> 등 다양한 타입을 표현할 수 있는 인터페이스 클래스이다. 주로 OpenCV 함수의 입력 인자 자료형으로 사용된다.

보통 다음과 같은 형태로 이름이 재정의되어 있다.

typedef const _InputArray& InputArray;

_InputArray는 OpenCV 라이브러리 내부에서 편의상 사용되는 인터페이스 클래스로, 다양한 타입으로부터 생성될 수 있다. 그러나 사용자가 명시적으로 _InputArray 클래스의 인스턴스나 변수를 생성하지는 못한다. 따라서 특정 함수의 인자가 InputArray 타입을 받도록 되어 있다면 Mat 클래스 객체나 vector<T> 타입 변수를 전달하는 형태만 가능하다.


사용자 정의 함수에서 Mat뿐 아니라 vector<T>까지 함께 전달받고 싶을 때 InputArray 타입 사용이 가능하다. 이때 함수 본문에서는 _InputArray 클래스의 멤버 함수 _InputArray::getMat() 함수를 사용해 Mat 타입으로 변환해서 사용해야 한다.

Mat _InputArray::getMat(int idx=-1) const;
---
 - idx : 참조할  번호, 음수이면 행렬 전체 참조
 - return : Mat 객체

아래는 예시.

[  1,   2,   3;
   4,   5,   6]
[1.2, 3.4000001, -2.0999999]

printMat() 함수는 Mat 행렬과 vector<T>의 원소 값을 출력한다. 함수의 인자로 전달받는 타입이 InputArray인 것을 확인할 수 있다. 두 경우 모두 getMat() 함수를 통해 Mat 객체를 생성한다.



2.4.2 OutputArray 클래스


많은 함수들이 영상을 입력으로 받아서 영상 처리를 수행하고, 그 결과를 다시 영상으로 생성하여 반환한다. 이때 출력을 OutputArray 클래스의 참조로 하여 결과 영상을 전달한다.

OutputArray는 다음 이름 재정의가 되어있다.

typedef const _OutputArray& OutputArray;

_OutputArray 클래스는 _InputArray 클래스를 상속받아 만들어졌으며 _OutputArray 클래스 역시 Mat, vector<T> 와 같은 타입의 객체로부터 생성될 수 있다.

_OutputArray 클래스는 새로운 행렬을 생성하는 _OutputArray::create() 함수가 정의되어 있다. 따라서 결과 영상을 저장할 새로운 행렬을 생성하고 결과를 저장하는 형태로 구현하는 경우가 많다.


OutputArray 클래스 역시 InputArray 클래스처럼 사용자가 직접 OutputArray 클래스의 변수를 만들어서 사용할 수 없다.



2.4.3 InputOutputArray 클래스


어떤 함수는 입력 영상 자체를 변경하여 다시 출력으로 반환한다. 이 경우에는 함수의 인자를 InputOutputArray 클래스로 사용한다. 입력과 출력 역할을 동시에 수행할 때 쓰인다.