관리 메뉴

ComputerVision Jack

[컴퓨터 비전 - opencv기본] 본문

Image Processing/Computer Vision

[컴퓨터 비전 - opencv기본]

JackYoon 2020. 1. 15. 14:11
반응형

opencv 클래스 및 기본 메소드에 대한 정리.

openCV주요 함수 간단 설명

Mat imread(const String& filename, int flags = IMREAD_COLOR);

#imread() 메소드

filename 영상 파일을 불러와 Mat객체로 변환하여 반환

폴더내의 파일을 불러오기 위해서 경로를 파일위치로 지정해 줘야 한다.

 

bool inwrite(const String& filename, InputArray img, const std::vector<int>& params = std::vector<int>)));

#Mat 객체에 저장되어 있는 영상 데이터를 파일로 저장하기 위해 사용하는 함수

 

bool Mat::empty() const

#데이터가 정상적으로 불러왔는지 확인하기 위한 함수

 

void namedWindow(const String& winname, int flags = WINDOW_AUTOSIZE);

#영상 데이터를 화면에 나타내기 위해 반창(윈도우) 생성하는 함수

 

void destroyWindow(const String& winname);

#하나의 창(윈도우)를 닫을 때 사용하는 함수

void destroyAllWindows();

#열려있는 모든 창을 닫을 때 사용하는 함수

 

void moveWindow(const String& winname, int x, int y);

#창 위치를 변경하는 함수

 

void resizeWindow(const String& winname, int width, int height);

#프로그램 동작중 출력 창의 크기를 변경하는 함수

 

void imshow(const String& winname, InputArray mat);

#Mat 클래스 객체에 저장된 영상 데이터를 화면에 출력하는 함수

 

int waitKey(int delay = 0);

#사용자로부터 키보드 입력을 받는 용도로 사용되는 함수

openCV 주요 클래스

기본 자료형 클래스

openCV는 영상 프로그래밍에서 자주 사용되는 다양한 자료형 클래스를 지원한다.

 

Point_ 클래스

2차원 평면 위에 있는 점의 자표를 표현하는 템플릿 클래스

x와 y의 멤버 변수를 가지고 있다.

Point pt;

pt.x = 10; pt.y = 10;

생성자를 통해서 초기화 가능하다.

기본적으로 연산자에 대한 연산자 재정의가 정의되어 있다.

 

Size_클래스

영상 또는 사각형 영역의 크기를 표현할 때 사용되는 템플릿 클래스

가로와 세로를 나타내는 width와 height 멤버 변수를 가지고 있다.

Size sz = sz1 + sz2; [width x height]

마찬가지로 연산자에 대한 제정의가 가능하다.

 

Rect_클래스

사각형의 위치와 크기 정보를 표현할 때 사용되는 템플릿 클래스

x, y 멤버 변수와 사격형의 가로및 세로 크기를 나타내는 width와 height멤버 변수를 가지고 있다.

Rect rc(10, 10, 100, 200);

연산자 재정의가 정의 되어 있으며 Point_클래스와 Size_클래와 연산이 가능하다.

논리 연산은 면적에 대해 정의내리면 이해하기 쉽다.

사각형 논리연산

왼쪽은 and 연산을 사용한 경우이고 오른쪽은 or연산을 사용하였다.

 

RotatedRect 클래스

회전된 사각형을 표현하는 클래스

중심 좌표 center와 가로 세로 size 그리고 회전 각도 angle 멤버 변수를 갖는다.

템플릿 클래스가 아니다.

RotatedRect rr( Point(40, 30), Size(40, 20), 30.f);

RotatedRect::points() 멤버함수 : 회전된 사각형 객체의 네 꼭지점 좌표를 알 수 있다.

(반환값 배열)

RotatedRect::boundingRect() 멤버 함수 : 회전된 사각형의 바운딩 박스를 구할 수 있다.

 

Range 클래스

범위 또는 구간을 표현하는 클래스

시작과 끝을 지칭하는 start와 end 멤버 변수를 갖고 있다.

Range r(0, 100);

 

String 클래스

openCV 4.0 버전 부터 std::string클래스와 String 클래스는 완전 같은 클래스이다.

연산자에 대한 재정의가 이루어져 있다.

format(const char* cc..); : c언어의 printf()함수와 유사하다.

Mat 클래스

Mat 클래스는 너무 중요하여 따로 정리가 필요하다.

Mat 클래스는 행렬을 표현하는 클래스이다.

고차원 행렬 또한 표현할 수 있으며 한 개 이상의 채널을 가질 수 있다.

2차원 영상 데이터 저장하고 처리 용도로 가장 많이 사용된다.

 

멤버 변수

Mat::dims  Mat 행렬의 차원

Mat::rows 와 Mat::cols 행과 열

다양한 멤버 변수가 존재한다. 멤버 변수는 public 접근.

 

생성자

Mat::Mat(int rows, int cols, int type); - Mat image(28, 28, CV_8UC1); 채널 1개

Mat::Mat(Size size, int type); - Mat image(Size(28, 28), CV_8UC3); 채널 3개

 

Mat::Mat(int rows, int cols, int type, const Scalar& s); - Mat image(28, 28, CV_8UC3, Scalar(0, 255, 255));

Mat::Mat(Size size, int type, const Scalar& s);

특정 값이 채워진 Mat객체를 생성할 수 있다.

 

행렬의 생성과 초기화

Mat::zeros(int rows, int cols, int type);

#모든 원소가 0으로 초기화 된 행렬 만드는 함수

 

Mat::ones(int rows, int cols, int type);

#모든 원소가 1로 초기화된 행렬 생성하는 함수

 

Mat::eye(int rows, int cols, int type);

#단위 행렬을 생성하는 함수

 

Mat 객체를 생성할 때, 기존에 이미 할당 되어 있는 메모리 공간의 데이터를 행렬의 원소 값으로 사용할 수 있다.

float data[] = {10, 20, 30}

Mat mat(1, 3, CV_32FC1, data);

 

Mat_ 클래스

Mat_ 템플릿 클래스는 Mat 클래스를 상속하여 만들어진 클래스.

Mat_ 객체로 만들어 Mat 객체로 변환하여 사용하기도 한다.

 

Mat::create(int rows, int cols, int type); - mat.create(28, 28, CV_8UC3);

#Mat 객체에 새로운 행렬을 할당하는 멤버 함수

 

Mat::setTo(InputArray value, InputArray mask = noArray());

Mat::operator = (const Scalar& s);

#행렬 전체 원소 값을 한번에 설정 할수 있다.

 

행렬의 복사

기본적으로 Mat m1, m3;

m3 = m1; 식의 대입 연산자를 통한 복사는 얕은 복사이다.

새로 메모리 할당 되는 것이 아닌 기존의 메모리가 있는 곳만 가리킨다.

 

Mat::clone() const;

Mat::copyTo(OutputArray, m) const;

#깊은 복사가 진행되는 멤버 함수. 새로운 메모리 공간이 할당 된다.

부분 행렬 추출

Mat 클래스로 정의된 행렬에서 특정 사각형 영역의 부분 행렬을 추출하고 싶은경우

Mat::operator()(const Rect& roi) const;

#()연산자 재정의를 사용하여 추출한다.

Mat image = img(Rect(10, 10, 100, 200)); 

팁은 추출한 영역을 독자적으로 새롭게 만들고 싶다면 깊은 복사를 실행하자.

 

Mat::rowRange(int startrow, int endrow) const;

Mat::colRange(int startcol, int endcol) const;

#행과 열 추출하고 싶은 경우

 

Mat::at() 함수

행렬 원소 접근 방법을 갖고 있는 at() 멤버 함수이다.

행열 두개의 인자를 받아 해당 위치의 원소 값을 참조 한다.

template<typename_Tp> _Tp& Mat::at(int y, int x)

 

간단한 Mat 정보 반환 하는 멤버 함수

Mat::channels() const; - 채널 수

Mat::depth() const; - 행렬의 깊이

Mat::elemSize() const;  - 원소가 차지하는 메모리 크기를 바이트 단위로 반환

Mat::empty() const; - 비어 있는 행렬이면 true를 반환한다.

Mat::isSubmatrix() const; - 다른 행렬의 부분 행렬이면 true를 반환한다.

 

행렬 연산

Mat::mul(InputArray m, double scale = 1) const;

#같은 위치에 있는 원소끼리 곱셈 연산을 수행 (수학적 행렬 곱은 *)

Mat::inv(int method = DECOMP_LU) const;

#역행렬을 구하는 멤버 함수

Mat::t() const;

#전치 행렬을 구하는 멤버 함수

 

Mat::reshape(int cn, int rows = 0) const;

#행렬의 shape을 변환하고 싶을 때 사용하는 멤버 함수

Mat::resize(size_t sz);

# 행렬의 모양이 아닌 단순히 행령의 행크기 변경

 

Vec 클래스

Scalar 클래스

공부하면서 참조함

 

 

반응형
Comments