OpenCV로 배우는 영상 처리 및 응용/ OpenCV의 기본 자료 구조

기본 템플릿 클래스

Point

멤버

타입 이름 내용
T x X 값
T y Y 값

함수

타입 이름 내용
T dot() 내적
double corss() 외적
bool inside() Point가 Rect 안에 있는지 여부

Point3

멤버

타입 이름 내용
T x X 값
T y Y 값
T z Z 값

함수

타입 이름 내용
T dot() 내적
double corss() 외적

Size

멤버

타입 이름 내용
T width Width 값
T height Height 값

함수

타입 이름 내용
T area() 내부 영역의 넓이 (Width x Height)

Rect

멤버

타입 이름 내용
T x X 값
T y Y 값
T width Width 값
T height Height 값

함수

타입 이름 내용
Point tl() 좌상된 좌표 반환
Point br() 우하단 좌표 반환
Size size() 사각형의 크기를 Size 형으로 반환
T area() 내부 영역의 넓이 (Width x Height)
bool contains() 사각형 내부에 좌표가 있는지 확인

Vec

  • Template 클래스
  • [ ]를 이용하여 원소들에 접근할 수 있다.
  • mul

함수

타입 이름 내용
T mul() 벡터의 element-wise 곱을 계산한다.

Scalar

  • Vec<Tp, 4>에서 파생된 템플릿 클래스로서 4개의 원소를 갖는다.
  • OpenCV에서 특별히 화소의 값을 지정하기 위한 자료형으로 정의되었으며 RGBA 4개의 값을 저장한다.

RotatedRect

  • 회전된 사각형을 나타내기 위한 클래스

멤버

타입 이름 내용
Point2f center 중심점
Size2f size 크기
float angle 회전된 각도

함수

타입 이름 내용
Rect boundingRect() 회전사각형 4개 모서리를 모두 포함하는 최소 크기의 사각형 영역을 반환
void points() 인수로 입력되는 pts 배열에 회전사각형의 4개 꼭짓점을 전달

Mat 클래스

행렬 자료형의 종류

데이터형 설명 Depth
CV_8U uchar 0
CV_8S signed char 1
CV_16U unsigned short int 2
CV_16S signed short int 3
CV_32S int 4
CV_32F float 5
CV_64F double 6

행렬 초기화 함수

타입 이름 내용
MatExpr ones() 행렬의 모든 원소 1인 행렬을 반환
MatExpr eye() 지정된 크기와 타입의 단위 행렬을 반환
MatExpr zeros() 행렬의 모든 원소를 0으로 초기화

멤버

타입 이름 내용
int dims 차원 수
int rows 행 갯수
int cols 열 개수        
uchar* data 행렬 원소 데이터에 대한 포인터
MatStep step 행렬의 한 행이 차지하는 바이트 수
MatSize size 행렬의 크기를 Size 형으로 반환

함수

타입 이름 내용
int channels() 행렬의 채널 수 반환
int depth() 행렬의 깊이 값 반환
Size elemSize() 행렬의 한 원소에 대한 바이트 크기 반환
Size elemSize1() 행렬의 한 원소의 한 채널에 대한 바이트 크기 반환
bool empty() 행렬 원소가 비어있는지 여부 반환
bool isSubmatrix() 참조 행렬인지 여부 반환
size step1() Step을 elemSize1()로 나누어서 정규화된 step 반환
size total() 행렬 원소의 전체 개수 반환
int type() 행렬의 데이터 타입(자료형 + 채널 수) 반환 자료형으로 상위 3비트 + 채널 수로 하위 3비트
void resize() 행의 개수를 기준으로 기존 행렬의 크기를 변경한다. 기존 행렬의 행의 개수보다 sz가 작으면 하단 행을 제거하고, 크면 기존 행렬 하단에 행을 추가한다.
Mat reshape() 행렬의 전체 원소 개수는 바뀌지 않으면서 행렬의 모양을 변경하여 새 행렬을 반환한다. 기존 행렬과 변경된 행렬의 전체 원소 개수(채널 수 x 행수 x 열수)가 일치하지 않으면 에러가 발생한다.
void create() 기존에 존재하는 행렬의 차원, 행, 열, 자료형을 변경하여 다시 생성한다. 기존 행렬과 크기와 자료형이 다르면 기존 메모리를 해제하고 새로운 데이터를 생성한다.
Mat clone() 행렬 데이터와 같은 값을 복사해서 새로운 행렬을 반환한다.
void copyTo() 행렬 데이터를 인자로 입력된 mat 행렬에 복사한다.
void convertTo() 행렬 원소의 데이터 타입을 변경하여 인수로 입력된 mat 행렬에 반환한다.
void push_back() 행렬의 마지막(bottom)에 원소들을 추가한다.
void pop_back() 행렬의 마지막(bottom)에서 원소들을 제거한다.
Mat cross() 두 개의 3-원소 벡터들의 외적(cross-product)을 계산한다.
Double dot() 두 벡터의 내적(dot-product)을 계산한다. 1행(1열) 벡터가 아니면 1차원 벡터로 간주하고 내적을 계산한다. 1차원 벡터의 구성은 위에서 아래로, 왼쪽에서 오른쪽의 순서로 스캔한다. 행렬이 1채널 이상이면, 각 채널들의 내적을 구하여 합산한다.
MatExpr inv() 역행렬을 계산한다.
MatExpr mul() 두 행렬의 각 원소 간(element-wise) 곱셈을 수행하여 반환한다.
MatExpr t() 해당 행렬의 전치를 수행한다. 여기서 t()는 실제로 전치를 수행하는 것이 아니라 임시로 전치된 행렬의 헤더를 반환한다. 반환된 헤더는 복잡한 행렬 연산에 사용하거나 새 행렬에 할당할 수 있다.

연산자

오른쪽 항의 데이터 타입 예문 내용
스칼라값 m1 = 100 행렬의 모든 원소를 지정된 스칼라값으로 변경하고자 할 때 사용한다. 마스크 행렬이 없는 MatsetTo()와 같은 역할을 한다.
행렬 수식 m1 = m2 + m3
m1 = m3 -7
수식의 결과가 m1 행렬에 복사된다.
행렬 m1 = m2 m2 행렬이 m1 행렬에 복사되는 것이 아니라 m2 행렬을 m1 행렬이 공유한다. 따라서 m2 행렬의 원소가 변경되면, m1 행렬의 원소도 변경된다.

Range 클래스

  • Range 클래스는 하나의 시퀀스에서 연속되는 서브 시퀀스를 지정하는 클래스이다. 주로 Mat 클래스에서 행 또는 열의 범위를 지정할 때 사용된다.
  • 멤버 변수로 start, end가 존재하는데, start는 주어진 범위 안에 포함되며, end는 포함되지 않는다.

함수

타입 이름 내용
int size() 서브 시퀀스의 크기를 반환한다.
bool empty() 서브 시퀀스가 비어있는지를 확인한다.
Range all() 서브 시퀀스가 가득차 있는지 반환한다.

행렬 헤더 관련 함수

타입 이름 내용
Mat row() 기존 행렬에서 지정된 행을 위한 행렬 헤더를 생성하여 반환한다.
Mat col() 기존 행렬에서 지정된 열을 위한 행렬 헤더를 생성하여 반환한다.
Mat rowRange() 기존 행렬에서 지정된 연속된 행을 위한 행렬 헤더를 생성하여 반환한다. 연속되는 행을 공유하고자 할 때 사용된다.
Mat colRange() 기존 행렬에서 지정된 연속된 열을 위한 행렬 헤더를 생성하여 반환한다. 연속되는 열을 공유하고자 할 때 사용된다.
void locateROI() 부분 행렬에서 부모 행렬의 크기와 위치를 알려준다.
void adjustROI() 부분 행렬에서 관심영역의 크기와 위치를 조정한다.
Mat operator() 사각형의 부분 행렬을 추출한다.

행렬의 메모리 해제

  • Mat::release() 함수는 행렬 데이터와 관련된 참조 카운터를 감소시킨다. 그리고 참조 카운터가 0에 도달하면, 행렬 데이터를 해제하고, 행렬 데이터와 참조 카운터의 포인터는 모두 null 값으로 설정함으로써 메모리를 해제한다.
  • 이 함수는 행렬 데이터의 해제를 위해서 명시적으로 호출할 수 있지만, Mat 클래스의 파괴자(destructor)에 의해 자동으로 호출되기 때문에 일반적으로 필요하지 않다.

예외처리

  • 영상 처리를 위해서 입력받는 영상 데이터는 기본적으로 채널당 8비트로 인코딩된 데이터이다. 8비트만을 이용하기 때문에 화소의 값에서 제한된 범위를 가진다.
  • 영상 데이터에 특정 연산을 할 경우 –컬러 공간 변환, 밝기/대조 조정, 샤프닝, 보간법 등– 대부분 산술연산 등으로 인해 음수나 소수점 이하의 값, 혹은 8비트의 범위를 벗어나는 값들을 갖게 할 것이다.
  • 이때 8비트만을 결과 값으로 사용하면 결과 영상에 오류가 발생될 수 있고 다음 단계의 영상 분석이나 처리에 영향을 줄 수 있다.
  • 이 문제를 해결하기 위해 포화 산술(saturation arithmetics) 연산이 사용된다. 이것은 8비트 범위일 때 다음과 같은 수식으로 나타낼 수 있다.
    • I(x, y) = min(max(round(r), 0), 255)
  • 즉, 어떤 연산의 결과 값(r)을 8비트로 저장한다고 할 때 비트 제한 범위를 넘으면 0 또는 255 가운데 가까운 값으로 저장한다.
  • OpenCV에서는 행렬에 대해 연산을 할 경우 기본적으로 포화 산술이 적용된다. 또한 기본 자료형에 대해 포화 산술 연산이 가능하도록 saturate_cast() 템플릿 메서드를 구현해 두었다.

예외처리 매크로

타입 이름 내용
define CV_Assert() 실행시간에 조건을 체크하는 매크로. 조건이 false가 되면 예외 발생
define CV_Error() 에러 코드 발생시 msg 문자열 출력
define CV_Error_() 에러 코드 발생시 args로 포맷 매칭하여 문자열 출력
[ssba]

The author

지성을 추구하는 디자이너/ suyeongpark@abyne.com

댓글 남기기

This site uses Akismet to reduce spam. Learn how your comment data is processed.