[컴퓨터 비전] OpenCV 영상 화면 출력, OpenCV주요 함수 - Week3_1

Ogu·2023년 10월 10일
0
post-thumbnail

영상을 화면에 출력하기

OpenCV에서 영상 데이터는 Mat 클래스를 이용하여 표현합니다.
Mat 클래스는 범용 행렬 클래스로, 0부터 255사이 정수 값의 원소를 갖는 이차원 행렬입니다.

BMP 파일에 저장된 영상을 화면에 출력하기 위해, 일단 영상 파일로부터 Mat 객체를 생성하고,
Mat 객체를 화면에 출력하는 OpenCV 함수를 호출합니다.

다수의 OpenCV 함수와 Mat 클래스는 모두 cv 네임스페이스로 선언되어 있어
함수와 클래스 이름 앞에 cv::를 붙입니다.

이러한 일은 번거롭기 때문에, 소스코드 맨 위에 using namespace cv; 문장을 추가하고 cv::를 생략합니다.

E또한 표준 입출력을 위한 std 네임스페이스도 using namespace std; 문장을 추가해 사용하면 편리합니다.

#include "opencv2/opencv.hpp"
#include <iostream>

using namespace cv;
using namespace std;

int main()
{
	std::cout << "Hello  OpenCV" << CV_VERSION << endl;

	Mat img;
	img = imread("lenna.bmp");

	if (img.empty()) {
		cerr << "Image load failed!" << endl;
		return -1;
	}

	namedWindow("image");
	imshow("image", img);

	waitKey(0);
    return 0;
}

lenna.bmp 파일을 HellOCV 프로젝터 폴더 안에 저장하면 다음과 같이 image라는 이름의 창에 lenna.bmp 영상이 나타납니다.

HelloCV에서 사용된 OpenCV 주요 함수

🌠 imread()

imread() 함수는 filename 영상 파일을 불러와 Mat객체로 변환하여 반환합니다.

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

  •  filename 불러올 영상 파일 이름
  •  flags 영상 파일 불러오기 옵션 플래그. ImreadModes 열거형 상수를 지정합니다.
  •  반환값 불러온 영상 데이터(Mat 객체)

imread() 함수는 BMP, JPG, TIF, PNG와 같이 널리 사용되는 대부분의 영상 파일 형식을 지원합니다.
filename으로 지정된 파일이 존재하지 않거나 잘못된 형식의 영상 파일이라면 비어있는 Mat 객체를 반환합니다. => Mat::empty() 를 이용해 Mat 객체가 제대로 생성되었는지 확인

flags는 영상 파일을 불러올 때 사용할 컬러 모드와 영상 크기를 지정합니다.
ImreadModes 열거형 상수를 지정할 수 있으며 주료 사용되는 상수들은 아래와 같습니다.
default 값은 IMREAD_COLOR입니다.

ImreadModes 열거형 상수설명
IMREAD_UNCHANGED입력 파일에 지정된 그대로의 컬러 속성을 사용합니다. 투명한 PNG 또는 TIFF 파일의 경우, 알파 채널까지 이용하여 4채널 영상으로 불러옵니다.
IMREAD_GRAYSCALE1채널 그레이스케일 영상으로 변환하여 불러옵니다.
IMREAD_COLOR3채널 BGR 컬러 영상으로 변환하여 불러옵니다.
IMREAD_REDUCED_GRAYSCALE_2크기를 1/2로 줄인 1채널 그레이스케일 영상으로 변환합니다.
IMREAD_REDUCED_COLOR_2크기를 1/2로 줄인 3채널 BGR 영상으로 변환합니다.
IMREAD_IGNORE_ORIENTATIONEXIF에 저장된 방향 정보를 사용하지 않습니다.

imwrite()

imwrite() 함수는 img 변수에 저장되어 있는 영상 데이터를 filename 이름의 파일로 저장합니다.
영상 파일 형식은 filename 문자열에 포함된 파일 확장자에 의해 결정됩니다.

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

Mat::empty()

mat 클래스의 멤버 함수로, 영상 데이터를 정상적으로 불러 왔는지 확인합니다.

bool Mat::empty() const

  • 반환값 : 행렬의 rows 또는 cols 멤버 변수가 0이거나, 또는 data 멤버 변수가 NUll이면 true 반환

🌠namedWindow()

Mat 클래스 객체에 저장되어 있는 영상 데이터를 화면에 나타내기 위해 먼저 영상 출력을 위한 빈 창을 생성해야 합니다. 이때 빈 창을 생성하는 함수가 namedWindow() 입니다.

OpenCV에서는 각각의 창에 고유한 문자열을 부여해 구분합니다.
winname으로 지정한 창의 고유 이름은 실제 생성되는 창의 상단 제목 표시줄에 출력됩니다.

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

  • winname : 영상 출력 창 상단에 출력되는 창 고유 이름. 이 문자열로 창을 구분
  • flags : 생성되는 창의 속성을 지정하는 플래그. WindowFlags 열거형 상수를 지정
WindowFlags 열거형 상수설명
WINDOW_NORMAL영상 출력 창의 크기에 맞게 영상 크기가 변경되어 출력
사용자가 자유롭게 창 크기를 변경 가능
WINDOW_AUTOSIZE출력하는 영상 크기에 맞게 창 크기가 자동으로 변경
사용자가 임의로 창 크기를 변경할 수 없음
WINDOW_OPENGLOpenGL 지원

destroyWindow(), destroyAllWindows()

namedWindow() 함수에 의해 생성된 영상 출력 창은 destroyWindow() 또는 destroyAllWindows() 함수를 이용해 닫습니다.

destroyWindow() 함수는 하나의 창을 닫고,
destroyAllWindows()는 열려 있는 모든 창을 닫습니다.

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

moveWindow()

창의 크기를 바꾸거나 위치를 바꿉니다.
(x, y) 좌표는 모니터 전체 화면에서 좌측 상단을 원점으로 간주함에 주의합니다.

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

  • winname : 위치를 이동할 창 이름
  • x : 창이 이동할 위치의 x 좌표
  • y : 창이 이동할 위치의 y 좌표

resizeWindow()

winname에 해당하는 창 크기를 가로 width, 세로 height 크기에 맞게 변경합니다.
이때 width와 height 크기는 창 전체 크기가 아니라 창의 뷰 영역에 나타나는 영상 크기입니다.

🌠 imshow()

imshow() 함수는 winname창에 mat 인자로 전달된 영상 데이터를 출력합니다
.

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

  • winname : 영상을 출력할 대상 창 이름
  • mat : 출력할 영상 데이터(Mat 객체)

InputArray 타입은 Mat, vector 등 다양한 객체를 표현할 수 있는 인터페이스 클래스입니다.

🌠 waitKey()

사용자로부터 키보드 입력을 받는 용도로 사용합니다.
.

int waitKey(int delay = 0);

  • delay : 키 입력을 기다릴 시간(밀리초 단위). delay ≤ 0이면 무한히 기다림
  • 반환값 : 눌린 키 값. 지정한 시간 동안 키가 눌리지 않았으면 -1을 반환

만약 지정한 delay 시간 동안 키 입력이 있으면 해당 키의 아스키 코드(ASCII code) 값을 반환합니다. 만약 지정한 시간 동안 키 입력이 없으면 waitKey() 함수는 -1을 반환합니다. dealy에 0이 전달되면 사용자가 키를 입력할 때까지 무한히 기다립니다.

무엇보다 중요한 것은, imshow() 함수만 사용해서는 영상이 화면에 나타나지 않습니다.
imshow() 함수를 호출한 후 waitKey() 함수를 호출해야 화면 그리기 이벤트가 동작하여 영상이 화면에 정상적으로 출력됩니다.

profile
Hello! I am Ogu, a developer who loves learning and sharing! 🐤🐤 <br> こんにちは!学ぶことと共有することが好きな開発者のOguです!🐤

0개의 댓글