1.2 영상 출력
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()
를 같이 호출히야 화면 그리기 이벤트가 동작, 영상이 화면에 출력된다.
-
`InputArray` 타입에 대한 설명은 언젠가 다시... ↩