OpenCV로 이미지를 띄워보는 코드를 간단한 설명과 함께 소개합니다. Ubuntu 환경에서 CMake로 빌드하는 방법도 함께 소개하도록 하겠습니다.
※ Visual Studio에서 만든 프로젝트에서 OpenCV를 사용하는 방법은 2019/04/11 – [OpenCV] – OpenCV 3.4.5 설치 & Visual Studio 2017에서 시작하기 글을 참고하시기 바랍니다.
1) OpenCV 코드
#include <iostream>
#include <opencv2/highgui/highgui.hpp>
using namespace std;
using namespace cv;
int main(int argc, char* argv[])
{
Mat img = imread(argv[1], -1);
if (img.empty())
{
cerr << "No Image" << endl;
return -1;
}
namedWindow("Example", cv::WINDOW_AUTOSIZE);
imshow("Example", img);
waitKey(0);
return 0;
}
2) Ubuntu에서 CMake로 빌드하기
CMakeLists.txt 파일 내용입니다. 프로젝트명은 Img로 하였습니다. OpenCV는 미리 설치되어 있어야 하는데, 2020/11/07 – [개발 관련] – Ubuntu 20.04 에서 OpenCV 4.5.0 설치하기 글을 참고하시기 바랍니다.
cmake_minimum_required(VERSION 3.0.0)
project(Img)
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIR})
add_executable(Img main.cpp)
target_link_libraries(Img ${OpenCV_LIBRARIES})
개인적으로 작업 폴더를 구성한 내용은 아래와 같습니다.
- ~/workspace/opencv/img: opencv 관련 프로젝트는 ~/workspace/opencv 하에 [프로젝트명] 폴더를 만듭니다.
- ~/workspace/opencv/img/src: 소스코드와 CMakeLists.txt 를 넣습니다.
- ~/workspace/opencv/img/build: 빌드 폴더입니다.
아래와 같이 입력하여 cmake configuration – Makefile생성 – 프로젝트 빌드 과정을 수행합니다.
$ cd ~/workspace/opencv/img/build
$ ccmake ../src/
$ make
$ ./Img
3) 코드 설명
① Mat img = imread(argv[1], -1);
imread함수는 이미지를 읽어서 Mat 구조체 타입으로 리턴하며, JPG, PNG, BMP, TIFF 등 다양한 포맷의 이미지를 쉽게 읽어올 수 있습니다. 이미지를 읽어오기 위해 자동으로 메모리 공간을 할당하고, 알아서 해제합니다.
- 첫번째 인자는 이미지 경로를 의미합니다.
- 두번째 인자는 이미지를 읽는 방식을 지정하는 플래그입니다. 대표적인 것만 소개합니다.
- IMREAD_UNCHANGED (-1): 이미지를 로드할 때, alpha channel도 포함합니다.
- IMREAD_GRAYSCALE (0): 이미지를 로드할 때, grayscale 으로 변환합니다.
- IMREAD_COLOR (1): 이미지를 로드할 때, 3 channel RGB 으로 변환합니다.
② img.empty()
이미지 읽기에 실패할 경우, false를 리턴합니다.
③ namedWindow(“Example”, cv::WINDOW_AUTOSIZE);
이미지를 띄울 수 있는 윈도우를 생성해서 엽니다.
- 첫번째 인자는 윈도우의 이름을 지정합니다. 이후부터는 지정한 이름을 통해 HighGUI library와 Window 간 Interaction이 일어납니다.
- 두번째 인자는 윈도우의 속성을 지정합니다. WINDOW_AUTOSIZE 속성은 이미지의 실제 크기대로 윈도우를 띄웁니다.
④ imshow(“Example”, img);
기존에 만들어진 윈도우에 이미지를 띄웁니다.
- 첫번째 인자는 이미지를 띄울 윈도우 이름을 지정합니다.
- 두번째 인자는 Mat 구조체 타입으로 읽어들인 이미지를 지정합니다. 만약 앞에서 namedWindow를 부르지 않았더라도, 윈도우가 생성되고 이미지도 뜹니다.
⑤ waitKey(0);
프로그램을 멈추고 Key입력이 들어올 때까지 기다리도록 합니다. 만약 인자 값이 양수라면, 밀리세컨드 단위 시간 후에 프로그램이 종료됩니다. 반면, 인자 값이 0이나 음수라면 프로그램은 종료되지 않고 키 입력을 대기합니다.