OpenCV Mat 함수를 이용한 이미지 불러오기_Visual Studio 2019_C++

1. 개요

OpenCV를 이용하여 작업을 하게 되는 경우 거의 대부분

이미지나 동영상을 불러와 작업을 하는 경우라고 생각합니다. 

한때는 OpenCV 라이브러리를 사용하여 프로젝트를 진행한다고 하면,

Python이 아닌 C나 C++을 이용하는 경우가 대부분이었는데 요즘은 Python이 대세인 것 같습니다 ㅎㅎ

 

이번 포스팅에서는 C++을 이용하여 OpenCV를 이용하여 이미지를 불러오는 방법을 알아보고,

각 함수에 대하여 간단하게 알아보도록 하겠습니다.

 

Windows 10Visual Studio 2019, OpenCV 4.3이 이번 포스팅의 작업환경이며,

OpenCV 버전이나 기타 요인에 따라 코드가 동작하지 않을 수 있습니다.

 

 

 

2. Mat 함수를 이용한 이미지 불러오기 코드

아래는 Mat 함수를 이용한 이미지 불러오기 및 출력하기 예제 코드입니다.

복사 붙여 넣기를 통해 프로젝트에 넣어주면 됩니다.

/*********************************************************
				Heisanbug OpenCV Test
				2020.07.04
				Mat 함수를 이용한 이미지 불러오고 출력하기
				Alta software developer
**********************************************************/

//C++ header file 
#include <iostream>

//opencv header file include
#include "opencv2/highgui.hpp"
#include "opencv2/core.hpp"


#define IMAGE_PATH "opencv_test_image.jpg"
#define COLOR_IMAGE_WINDOW_NAME "color image"
#define GRAY_IMAGE_WINDOW_NAME "gray image"

//project main function
int main(int argc, char** argv) {
	
	//OpenCV Mat class
	cv::Mat imageColor;
	cv::Mat imageGray;

	//경로의 이미지를 image 변수에 읽어옵니다.
	//imread flag 값에 따라 color 이미지 혹은 
	//gray scale 이미지를 불러옵니다.
	imageColor = cv::imread(IMAGE_PATH, cv::IMREAD_COLOR);
	imageGray = cv::imread(IMAGE_PATH, cv::IMREAD_GRAYSCALE);

	//이미지를 정상적으로 읽어왔는지 확인
	if (imageColor.empty() || imageGray.empty()){
		std::cout << IMAGE_PATH 
			<<" 이미지를 불러오는 데 문제가 생겼습니다." << std::endl;
		return -1;
	}

	//이미지를 window를 생성하여 보여줍니다.
	cv::namedWindow(COLOR_IMAGE_WINDOW_NAME, cv::WINDOW_NORMAL);
	cv::namedWindow(COLOR_IMAGE_WINDOW_NAME, cv::WINDOW_AUTOSIZE);
	cv::imshow(COLOR_IMAGE_WINDOW_NAME, imageColor);
	cv::imshow(GRAY_IMAGE_WINDOW_NAME, imageGray);

	//키 입력이 있을 때 까지 기다립니다.
	cv::waitKey(0);

	//생성하였던 윈도우를 제거합니다.
	cv::destroyWindow(COLOR_IMAGE_WINDOW_NAME);
	cv::destroyWindow(GRAY_IMAGE_WINDOW_NAME);

	//아래의 함수를 사용하면, 사용하고 있던 윈도우 전부를 제거합니다.
	//cv::destroyAllWindows();

	return 0;
}

 

 

**Visual Studio 2019에서 OpenCV를 사용하려면 아래의 포스팅을 참고하세요.

https://heisanbug.tistory.com/21

 

Visual Studio 2019에 OpenCV 설치하기_Windows 10_OpenCV 4.3

1. 개요 Visual Studio 2019에서 C++ 언어 기반의 프로젝트에서 OpenCV 라이브러리를 이용하는 경우 OpenCV 라이브러리를 직접 다운로드하고 Path 설정을 해줘야 합니다. 처음 OpenCV를 설치하시는 분들을 위�

heisanbug.tistory.com

 

 

 

 

3. 프로젝트에서 이미지 불러오기

opencv_test_image.jpg
3.29MB

본 프로젝트는 위의 이미지를 이용하여 테스트를 진행하였습니다.

jpg 형식의 이미지를 이용하였으며, 이미지의 크기는 5312 x 2988입니다.

**직접 촬영한 사진이며, 상업적인 용도가 아니라면 사진은 자유롭게 사용이 가능합니다.

 

 

이미지를 불러오기 위해서는 이미지의 경로를 입력해주어야 합니다.

예제 코드에서 

#define IMAGE_PATH "opencv_test_image.jpg"

부분이 이미지 Path를 설정하는 부분이며, 프로젝트 내부에 이미지를 넣기 위해서는

솔루션 우클릭 > 파일탐색기에서 폴더 열기 를 눌러 열리는 폴더에 이미지를 넣으면 됩니다.

 

 

이번 포스팅에서는 opencv_test_image.jpg 파일을 프로젝트 폴더에 넣어 이미지를 불러오는 방식입니다.

**다른 디렉터리에 이미지를 불러와야 한다면, 이미지의 전체 경로 혹은 상대 경로를 입력해줘야 합니다.

 

 

 

 

4. cv::imread로 이미지를 읽어오기

	//OpenCV Mat class
	cv::Mat imageColor;
	cv::Mat imageGray;

	//경로의 이미지를 image 변수에 읽어옵니다.
	//imread flag 값에 따라 color 이미지 혹은 
	//gray scale 이미지를 불러옵니다.
	imageColor = cv::imread(IMAGE_PATH, cv::IMREAD_COLOR);
	imageGray = cv::imread(IMAGE_PATH, cv::IMREAD_GRAYSCALE);

	//이미지를 정상적으로 읽어왔는지 확인
	if (imageColor.empty() || imageGray.empty()){
		std::cout << IMAGE_PATH 
			<<" 이미지를 불러오는 데 문제가 생겼습니다." << std::endl;
		return -1;
	}

위의 코드가 OpenCV에서 이미지를 불러와 Mat에 저장하는 부분입니다.

cv::imread 메서드를 이용하여 이미지를 읽을 수 있으며,

IMAGE_PATH의 경로로부터 이미지를 불러옵니다.

뒤에 Flag를 이용하면, 이미지를 Color 혹은 Gray Scale로 이미지를 불러올 수 있습니다.

 

예제에서는 Color와 Gray Scale 이미지를 각각 불러오게 됩니다.

 

 

 

5. cv::imshow를 이용하여 이미지 출력하기

	//이미지를 window를 생성하여 보여줍니다.
	cv::namedWindow(COLOR_IMAGE_WINDOW_NAME, cv::WINDOW_NORMAL);
	cv::namedWindow(COLOR_IMAGE_WINDOW_NAME, cv::WINDOW_AUTOSIZE);
	cv::imshow(COLOR_IMAGE_WINDOW_NAME, imageColor);
	cv::imshow(GRAY_IMAGE_WINDOW_NAME, imageGray);

	//키 입력이 있을 때 까지 기다립니다.
	cv::waitKey(0);

	//생성하였던 윈도우를 제거합니다.
	cv::destroyWindow(COLOR_IMAGE_WINDOW_NAME);
	cv::destroyWindow(GRAY_IMAGE_WINDOW_NAME);

	//아래의 함수를 사용하면, 사용하고 있던 윈도우 전부를 제거합니다.
	//cv::destroyAllWindows();

Mat에 저장된 이미지를 Winow를 생성하여 출력하는 부분입니다.

cv::namedWindow 메서드를 이용하여 Window를 생성하고,

cv::imshow 메서드를 이용하여 Window에 이미지를 출력합니다.

 

cv::namedWindow의 Flag를 cv::WINDOW_NORMAL로 설정하면 window의 크기를 자유롭게 조절 가능합니다.

cv::namedWindow의 Flag를 cv::WINDOW_AUTOSIZE로 설정하면 window의 크기가 자동으로 화면에 맞게 출력됩니다.

 

cv::waitKey(0)은 사용자의 키보드 입력을 기다리는 기능을 하며,

키보드 입력을 하게 되면 cv::destroyWindow 메서드를 이용하여 윈도우를 닫고 프로그램을 종료합니다.

 

 

color image Window출력
gray image Window 출력

예제를 실행시키면 위의 Window 화면이 뜨게 되며, 키보드 입력을 하면 프로그램이 종료됩니다.

컴퓨터 디스플레이 해상도가 WQXGA(2560x1600)이고, 이미지의 해상도(5312 x 2988)가 더 크기 때문에

cv::WINDOW_AUTOSIZE Flag 옵션을 사용한 Window에서는 이미지가 전체 출력되지 않는 모습입니다.

 

 

 

6. 기타

C++에서 저는 using namespace 명령어를 쓰지 않는 편이 좋다고 생각해서 최대한 사용을 자제하는 스타일입니다.

 

너무나도 간단한 작업이지만 처음 이미지를 불러오는 데 성공하였을 때의 신기함은 아직도 생생합니다.

혹시 어려움을 겪고 있으시거나, 문의사항이 있으시다면 댓글로 남겨주세요!!

최대한 빠르게 답변하겠습니다.

 

 

 

X. 참고 사이트

https://docs.opencv.org/4.3.0/index.html

댓글

Designed by JB FACTORY