1. 개요
OpenCV를 이용하여 작업을 하게 되는 경우 거의 대부분
이미지나 동영상을 불러와 작업을 하는 경우라고 생각합니다.
한때는 OpenCV 라이브러리를 사용하여 프로젝트를 진행한다고 하면,
Python이 아닌 C나 C++을 이용하는 경우가 대부분이었는데 요즘은 Python이 대세인 것 같습니다 ㅎㅎ
이번 포스팅에서는 C++을 이용하여 OpenCV를 이용하여 이미지를 불러오는 방법을 알아보고,
각 함수에 대하여 간단하게 알아보도록 하겠습니다.
Windows 10에 Visual 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
3. 프로젝트에서 이미지 불러오기
본 프로젝트는 위의 이미지를 이용하여 테스트를 진행하였습니다.
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 메서드를 이용하여 윈도우를 닫고 프로그램을 종료합니다.
예제를 실행시키면 위의 Window 화면이 뜨게 되며, 키보드 입력을 하면 프로그램이 종료됩니다.
컴퓨터 디스플레이 해상도가 WQXGA(2560x1600)이고, 이미지의 해상도(5312 x 2988)가 더 크기 때문에
cv::WINDOW_AUTOSIZE Flag 옵션을 사용한 Window에서는 이미지가 전체 출력되지 않는 모습입니다.
6. 기타
C++에서 저는 using namespace 명령어를 쓰지 않는 편이 좋다고 생각해서 최대한 사용을 자제하는 스타일입니다.
너무나도 간단한 작업이지만 처음 이미지를 불러오는 데 성공하였을 때의 신기함은 아직도 생생합니다.
혹시 어려움을 겪고 있으시거나, 문의사항이 있으시다면 댓글로 남겨주세요!!
최대한 빠르게 답변하겠습니다.
X. 참고 사이트
'Coding > OpenCV' 카테고리의 다른 글
OpenCV VideoWriter를 이용한 영상 저장_C++ (4) | 2020.07.26 |
---|---|
OpenCV Mat 함수를 이용한 영상 불러오기_Visual Studio 2019_C++ (11) | 2020.07.16 |
Visual Studio 2019에 OpenCV 설치하기_Windows 10_OpenCV 4.3 (30) | 2020.07.04 |