2. OpenCV 기초 및 OpenCV 클래스


2.1 OpenCV 기초 사용법

OpenCV에서 영상 데이터는 cv 네임스페이스의 Mat 클래스(cv::Mat)를 이용하여 표현한다.

ㄱ) 이미지 읽기
Mat imread(const String& filename, int flags = IMREAD_COLOR);

ㆍfilename == 불러올 이미지의 이름 ( 경로 )
ㆍflags == 이미지 읽을 때의 옵션, default는 3채널 컬러이미지.
ㆍreturn == Mat <– 읽은 이미지 반환

ㄴ) 이미지 쓰기(저장)
bool imwrite(const String& filename, InputArray img, const vector& params = vector());

ㆍfilename == 저장할 이미지의 이름 ( 경로 )
ㆍimg == 저장할 이미지 데이터
ㆍparams == 저장할 영상 파일 형식에 의존적인 파라미터(플래그 & 값) 쌍
ㆍreturn == bool <– 저장성공 true, 실패 false

ㄷ) 이미지 출력
void imshow(const String& winname, InputArray mat);

ㆍfilename == 이미치 출력하는 윈도우의 이름
ㆍimg == 출력할 이미지 데이터

cf) imshow 출력창에 나타난 데이터를 ctrl + c 로 클립보드 복사 또는 ctrl + s 로 파일 형태로 저장 가능
ㄹ) 키보드 입력을 기다리기 ( 이미지 출력 시간 조절 기능 )
int waitKey(int delay = 0);

ㆍdelay == 키보드 입력을 기다리는 시간(밀리초 단위), 0 또는 음수를 주면 무한히 대기
ㆍreturn == 눌린 키보드 입력 값 반환, 키가 눌리지 않았다면 -1

cf) Mat 클래스의 멤버 함수 Mat.empty()로 이미지가 잘 읽어졌는지 확인
사용 예시
Mat img;  

img = imread("your_img.png");  

if(img.empty())  
{  

  cerr << "이미지 읽기 실패!" << endl;  

  return -1;  

}

imshow("first_frame", img);  
waitKey(3000);

imwrite("save_img", img);

...

2.2 OpenCV 기본 자료형 클래스

ㄱ) 픽셀의 좌표를 표현하는 Point_ 클래스

Point_ 클래스는 2차원 평면 위에 있는 점의 좌표를 표현하는 템플릿 클래스이다.
Point_ 클래스는 x, y라는 멤버 변수를 가지고 있다.
기본 생성자로 x, y는 0으로 초기화된다.

템플릿 클래스이기 때문에, 사용할 때에 어떤 자료형으로 좌표를 표현하는 것인지 명시해야 한다.
ex) 정수 좌표를 사용하려면 Point_<int>라고 명시

자주 사용되는 자료형에는 매번 이런 작업을 하기가 번거롭기 때문에, OpenCV에서는 자주 사용되는 자료형에 대해
이름을 재정의하여 제공한다.

int 자료형 -> Point2i 클래스 또는 Point 클래스 , float 자료형 -> Point2f 클래스

사용 예시
Point pt1;  // pt1.x와 pt1.y 는 0으로 초기화, 즉 pt1 = (0, 0)  

pt1.x = 5;  
pt1.y = 10;  

ㄴ) 영상 또는 사각형 영역의 크기를 표현하는 Size_ 클래스의

Size_ 클래스는 사각형 영역의 가로와 세로 크기를 나타내는 width와 height 멤버 변수를 가지고 있다.
기본 생성자로 width, height 는 0으로 초기화된다.

멤버함수
Size::area() -> 사각형의 넓이 반환하고,
Size::empty() -> 유효하지 않은 크기이면 true 반환한다.

사용 예시
Size sz1, sz2(10, 20); // sz1 은 가로, 세로가 0, 0 -> 즉, sz1 = [0 X 0], sz2 = [10 X 20]


sz1.width = 5;  
sz1.height = 10; // sz1[5 X 10]으로 변경


int area = sz2.area(); // 200이 area에 저장됨  

ㄷ) 사각형의 위치와 크기 정보를 나타내는 Rect_ 클래스

Rect_ 클래스는 사각형의 좌상단 좌표 x, y 멤버 변수와 가로 세로 width, height 멤버 변수를 가진다.
기본 생성자로 모든 멤버 변수는 0으로 초기화된다.

멤버함수 Rect::tl() -> 사각형 좌상단 좌표 반환 // topleft
Rect::br() -> 사각형 우하단 좌표 반환 // bottomright
Rect::size() -> 사각형 크기 정보 반환
Rect::area() -> 사각형 넓이 반환
Rect::empty() -> 유효하지 않은 사각형이면 true 반환
Rect::contains(const Point_<_Tp>& pt) -> 인자로 전달된 점 pt가 사각형 내부에 있으면 true 반환

사용 예시
Rect rc1; // rc1 = [0 X 0 from (0, 0)] --> 0,0 좌표로 부터 가로, 세로 0, 0  


Rect rc2(10, 10, 60, 40); // rc2 = [60 X 40 from (10, 10)] --> 10,10 좌표로 부터 가로 60 세로 40  

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

멤버변수
회전된 사각형의 중심 좌표를 나타내는 center
사각형의 가로 및 세로 크기를 나타내는 size
회전 각도(시계방향의 회전 각도로 표현)를 나타내는 angle
기본 생성자로 모든 멤버 변수는 0으로 초기화된다.

멤버함수
RotatedRect::points(Point2f pts[]) -> 회전된 사각형의 4개의 꼭지점 좌표를 pts에 저장
RotatedRect::boundingRect() -> 회전된 사각형을 포함하는 최소 크기의 사각형 정보를 반환(정수 단위)
RotatedRect::boundingRect2f() -> 회전된 사각형을 포함하는 최소 크기의 사각형 정보를 반환(실수 단위)

사용 예시
RotatedRect rr1(Point2f(40, 30), Size2f(40,20), 30.f);  
// center의 좌표가 (40, 30)이고, 크기가 40X20이면서, 시계방향으로 30도 회전된 사각형 객체 rr1 생성

ㅁ) 범위를 표현하는 Range 클래스

Range클래스는 start부터 end까지의 정수 단위 범위를 표현한다.
이때 start는 범위에 포함되고, end는 포함되지 않는다.

멤버변수
범위의 시작을 나타내는 start
범위의 끝을 나타내는 end

멤버함수
Range::size() -> 범위의 크기 (end - start) 반환
Range::empty() -> start와 end가 같으면 trur 반환
Range::all() -> start = INT_MIN, end = INT_MAX로 설정된 Range 객체 반환

사용 예시
ex) Range r1(0, 10); -> 0부터 9까지의 범위를 나타낸다.

ㅂ) 문자열을 표현하는 String 클래스

OpenCV에서는 std::string이 아니라 cv::String 클래스를 사용해서 문자열을 처리한다.
그러나 std::string 클래스와 완전히 호환되도록 설계되어서 std::string을 사용하듯 쓸 수 있다.

OpenCV 4.0부터는 std::string과 cv::string이 완전히 같은 클래스가 되었다.
String format(const char* fmt, …);

ㆍfmt == 형식 문자열
ㆍ… == 가변 인자
ㆍreturn == 지정한 형식으로 생성된 문자열

사용 예시
Mat imgs[3];  

for(int i =0; i < 3; i++)  
{  

  String filename = format("test%02d.bmp", i + 1);  

  imgs[i] = imread(filename);  

}
⤧  Next post 2019/11/1_Computer Vision_3_ OpenCV Mat 클래스 ⤧  Previous post 2019/10/14_Computer Vision_1_컴퓨터 비전 개요 및 이미지 파일 형식