메뉴 닫기

OpenCV로 이미지 출력하기 (+CMake 이용 방법)

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이나 음수라면 프로그램은 종료되지 않고 키 입력을 대기합니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다