Vector, Scalar, InputArray, OutputArray 클래스 정리

nugurii0·2022년 9월 12일
0

다중차로인식

목록 보기
5/11

Vec과 Scalar 클래스

Vec 템플릿 클래스는 벡터를 표현하기 위해 사용된다. 그리고 Vec 클래스의 특별한 형태인 Scalar 클래스도 함께 배운다.

Vec 클래스

하나의 행으로만 이루어진 행렬을 행 벡터, 하나의 열로만 구성되면 열 벡터라고 부른다.

그리고 이러한 행 벡터와 열 벡터를 합쳐서 벡터 또는 벡터 행렬이라고 부른다.

Vec클래스는 Matx 클래스를 상속받아 만들어지며 열 개수가 1개로 특화된 벡터 표현 클래스이다.

Vec 클래스도 템플릿을 사용하기에 자료형과 데이터 개수(채널)을 명시해야 한다.

하지만 이러한 표현 대신 이름 재정의를 통해 편하게 사용할 수 있도록 구현하였다.

이름 재정의 형식은 다음과 같다.

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

num-of-data에는 채널 개수가, 뒷 부분에는 순서대로 uchar, short, ushort, int, float, double 자료형을 의미한다.

ex) 3채널 컬러 영상 변수 선언

Vec<uchar, 3> p1;

Vec3b p1;

만약

Vec3b p(0,0,255) 와 같이 선언하면

내부에 uchar val[3] 멤버 변수를 가지고 있게 된다. 그리고 p.val[0], p.val[1]은 0, p.val[2]는 255로 초기화된다.

이외에도 여러 멤버 변수와 연산자 재정의도 제공한다.

Scalar 클래스

4채널 이하의 영상에서 픽셀 값을 표현하는 용도로 사용된다.

보통 네 개 이하의 채널을 갖는 영상의 픽셀을 표현하는 용도이다.

그레이스케일이면 1채널로 밝기를, 트루컬러면 3채널을 사용하여 BGR을, PNG처럼 투명도를 표현하는 경우 4채널로 마지막 채널에 투명도를 저장하여 사용한다.

InputArray와 OutputArray 클래스

InputArray는 함수의 입력에, OutputArray는 함수의 출력에 사용된다.

InputArray

다양한 타입으로 생성될 수 있는 인터페이스 클래스이다.

만약 OpenCV의 특정 함수가 InputArray 타입으로 인자를 받는다면 Mat 클래스 객체 또는 Vector 타입의 변수를 전달하는 형태로 사용하면 된다.

InputArray에 빈 행렬을 전달하려면 noArray() 또는 Mat()를 전달하면 된다.

사용자 정의 함수에서 Mat객체 뿐만 아니라 vector타입의 객체를 전달받고 싶으면 InputArray타입으로 전달받고 getMat() 함수를 사용하여 Mat 객체 타입으로 변환하여 사용할 수 있다.

Mat _InputArray::getMat(int idx=-1) const

idx 행을 참조한다. 단, idx<0이면 행렬 전체를 참조한다.

OutputArray

보통 영상을 입력으로 받아 처리를 수행하고, 그 결과를 다시 영상으로 생성하여 반환한다.

이때 return으로 반환하는 것이 아닌 OutputArray 클래스의 참조를 함수 인자로 사용하여 결과를 전달한다.

InputArray와 마찬가지로 Mat, Vector같은 타입의 변수를 전달하도록 코드를 작성하면 된다.

만약 입력 영상 자체를 변경하여 다시 출력하려면 InputOutputArray클래스 타입의 인자를 사용하면 된다.

profile
개발과 보안을 공부하는 학생

0개의 댓글