4 minute read



1.2.1 화면에 영상 출력


OpenCV는 영상 데이터를 Mat 클래스로 표현한다. Mat 클래스에 대한 자세한 설명은 Ch. 3으로 미루고, 지금은 그냥 그렇다고만 알고 있자.

Mat 클래스는 namespace cv 내에서 정의된다. 영상은 0~255 사이 값을 성분으로 갖는 행렬로 표현될 수 있으므로 영상 파일을 출력하기 위해서는 영상으로부터 Mat 객체를 생성하고, 이 객체를 화면에 출력하는 OpenCV 함수를 호출하면 된다.


먼저 출력할 영상이 프로젝트 폴더 내에 존재해야 한다. 편의 상 프로젝트 폴더 내에 asset 폴더를 만들고 그 안에 사진을 집어넣자. 이때 폴더는 해당 코드와 같은 공간에 있어야 한다.

다음은 예시로 사용할 example.jpg 파일.



Line 9 : Mat 클래스 타입의 변수 img 선언

Line 10 : imread() 함수로부터 example.jpg 파일을 불러온다. 불러온 파일을 img 라는 변수에 저장한다. 이때 불러오고자 하는 파일의 상대적인 경로(또는 절대 경로)를 지정한다.

Line 12~16 : 파일을 제대로 불러오지 못했을 때를 위한 예외 처리.

Line 18 : namedWindow() 함수는 영상을 출력하기 위한 새로운 창을 생성한다. 이 창의 이름은 image이다.

Line 19 : imshow() 함수는 image라는 이름의 창에 img 객체가 갖고 있는 영상 파일을 출력한다.

Line 21 : waitKey() 함수는 사용자의 키보드 입력을 기다린다. 사용자가 키보드를 누르기 전까지 영상을 화면에 계속 출력하는 것. 키보드를 누르면 Line 21을 지나 return을 맞이하게 된다.



뒤쪽 terminal 창에 있는 잔뜩 나오는 코드들은 debug 모드에서 실행했을 때 나오는 메세지들이다. Release 모드로 바꾸면 나오지 않는다. 오류가 아니니 안심할 것.



1.2.2 함수 설명


여기서 사용한 함수에 대한 설명.


imread()


Mat imread(const String& filename, int flags = IMREAD_COLOR);
---
filename : 불러올 영상 파일 이름
flags : 불러오기 옵션. ImreadModes 열거형 상수를 지정.
return : 불러온 영상 데이터(Mat 객체)

imread() 함수는 filename이라는 이름의 영상을 불러 와 Mat 객체로 변환시킨 뒤에 반환한다. 만약 지정된 파일이 존재하지 않으면 빈 Mat 객체를 반환.

그러므로 imread() 함수를 사용한 뒤 제대로 불러왔는지 확인하기 위해 Mat::empty()를 사용하자.


imread() 함수의 두 번째 인자 flag는 영상을 불러올 때의 옵션을 지정한다.

ImreadModes 열거형 상수 설명
IMREAD_UNCHAGED 입력 파일에 지정된 그대로의 컬러 속성을 사용.
IMREAD_GRAYSCALE 1채널 그레이스케일로 변환.
IMREAD_COLOR 3채널 BGR 컬러 영상으로 변환(Default).
IMREAD_REDUCED_GRAYSCALE_2 크기를 1/2로 줄인 1채널 그레이스케일로 변환.
IMREAD_REDUCED_COLOR_2 크기를 1/2로 줄인 3채널 BGR 컬러 영상으로 변환.


Mat::empty()


bool Mat::empty() const
---
return : 행렬의 rows, 또는 cols 멤버 변수가 0이거나, data 멤버 변수가 NULL이면 true 반환

Mat 클래스의 멤버함수 empty()는 영상 데이터가 제대로 불러왔는지를 확인할 때 사용한다.


imwrite()


bool imwrite(const String& filename, InputArray img, const std::vector<int>& params = std::vector<int>());
---
filename : 저장할 영상 파일 이름
img : 저장할 영상 데이터(Mat 객체)
params : 저장할 영상 파일 형식에 의존적인 파라미터(플래그 & ) pair
return : 정상적으로 저장되면 true, 실패  false

imwrite()함수는 img 변수에 저장되어 있는 영상 데이터를 filename이라는 이름의 파일로 저장.

param 인자의 형식은 std::vector<int>이며 두 정수값 쌍으로 지정한다.

img 변수에 저장된 영상을 example.jpg로 저장할 때, JPEG 압축륙을 95%로 지정하려고 한다면,

위 예시에서 IMWRITE_JPEG_QUALITY가 바로 JPEG 압축률을 나타내는 옵션.


namedWindow()


void namedWindow(const String& winname, int flags = WINDOW_AUTOSIZE);
---
winname : 영상 출력  상단에 표시되는  이름. 창을 구분할  사용된다.
flags : 창의 속성 지정 플래그. WindowsFlag 열거형 상수 지정.
WindowsFlag 열거형 상수 설명
WINDOW_NORMAL 출력 창의 크기에 맞게 영상 크기가 변경되어 출력. 사용자가 임의로 창 크기를 변경 가능.
WINDOW_AUTOSIZE 영상 크기에 맞게 출력 창 크기가 변경되어 출력. 사용자가 임의로 창 크기 변경 불가(Default).
WINDOW_OPENGL OpenGL 지원.

다만 모니터 해상도보다 큰 영상을 출력하려고 할 경우, WINDOW_AUTOSIZE로 생성된 영상의 일부가 화면에 표시되지 않을 수 있다.


destroyWindow()


void destroyWindow(const String& winname);
void destroyAllWindows();
---
winname : 소멸시킬  이름

destroyWindow() 함수는 namedWindow() 함수로 생성된 창을 닫는다. destroyAllWindows() 함수로 열려 있는 모든 창을 닫을 수 있다.


moveWindow()


void moveWindow(const String& winname, int x, int y);
---
winname : 위치를 이동시킬  이름
x : 창이 이동할 위치의 x 좌표
y : 창이 이동할 위치의 y 좌표

moveWindow() 함수는 winname이라는 이름의 창을 $(x,y)$ 위치로 이동시킨다. 이때 좌표는 모니터 전체 화면의 좌표로, 좌측 상단이 원점으로 정의되어 있다.


resizeWindow()


void resizeWindow(const String& winname, int width, int height);
---
winname : 크기를 변경시킬  이름
width : 창의 가로 길이
height : 창의 세로 길이

resizeWindow() 함수는 winname이라는 이름의 창 크기를 가로 width, 세로 height에 맞게 변경시킨다. 이때 인자 width, height는 창 전체 크기가 아니라 창의 뷰 영역에 나타나는 영상 크기이다.

단, WINDOW_AUTOSIZE flag로 만들어진 영상 출력 창은 resizeWindow()로 변경시킬 수 없다.


imshow()


void imshow(const String& winname, InputArray mat);
---
winname : 영상을 출력할 
mat : 출력할 영상 데이터(Mat 객체)

imshow() 함수는 winname이라는 이름의 창에 mat에 저장된 영상 데이터를 출력.

두 번째 인자의 자료형이 InputArray인 것에 주목. 사실 InputArray 타입은 Mat. vector<T> 등 다양한 객체를 표현할 수 있다. OpenCV에서 자주 사용되는 자료형. 대체로 Mat이라고 생각해도 무방.1


만약 imshow() 함수가 호출될 적에 winname이라는 이름의 창이 없으면? imshow() 함수는 WINDOW_AUTOSIZE 속성의 창을 스스로 만들어서 출력한다. 따라서 필요하면 nameWindow() 함수 호출을 생략해도 무방.

출력 창에 나타난 영상 데이터를 파일로 저장하고 싶으면 Ctrl + S. 비트맵 형식으로 클립보드에 복사하려면 Ctrl + C


waitKey()


int waitKey(int delay = 0);
---
delay :  입력을 기다리는 시간(ms). 0 이하이면 무한히 기다린다.
return : 눌린  . 키가 눌리지 않으면 -1 반환

waitKey() 함수는 delay만큼의 시간 동인 키 입력을 기다린다.

실제로는, imshow()만 있어서는 영상이 화면에 나타나지 않는다. waitKey()를 같이 호출히야 화면 그리기 이벤트가 동작, 영상이 화면에 출력된다.



  1. `InputArray` 타입에 대한 설명은 언젠가 다시...

Tags:

Categories:

Updated: