본문 바로가기

IT/OPENCV

[OPENCV] 2. OpenCV 로 이미지 파일 출력하기

반응형

☞ 메인보드 : Jetson Nano Developer Kit

운영 체제 : Ubuntu 18.04 - JetPack 4.3

☞ 언어 : C++

 

 

 

 


목차

1. workspace 만들기

2. 코드 작성

3. CMAKE

4 . 실행 결과

 

 

 


 

 

 

 

1. Jetson Nano 보드 ubuntu 18.04에서 OpenCV 설치 및 CUDA 빌드

메인보드 : Jetson Nano Developer Kit 이미지 파일 버전 : JetPack 4.3 # OpenCV 설치 준비 이 설치는 Jetson Nano 보드에서 설치하였음 이 보드는 OpenCV 3.3.1 버전을 내장하고 있음 그리고 이는 pkg-config 명..

95mkr.tistory.com

이전 포스트에서는 opencv 4.2.0 버전을 설치해보았고, 이번 포스트에서는 이미지를 띄워보는 간단한 예제를 해보려고 한다.

 

 

 

 

① workspace 만들기

 

 

 

mkdir -p ~/workspace/camera_test/src
cd ~/workspace/camera_test/src

 

앞으로 학습을 계속할 것이기 때문에 패키지별 저장을 위한 workspace를 만들고 해당 디렉터리에 들어간다.

[mkdir의 -p 옵션은 만들 디렉터리 안에 하위 디렉터리를 함께 생성할 때 사용한다.]

 

 

[편집기] camera_test.cpp

 

camera_test.cpp 라는 소스파일을 만들어주고, 코드를 입력한다. [편집기는 nano, gedit, vi 등 본인에게 편한 것으로 사용하자.]

 

 

 

 

인터넷에서 이번 포스트에 사용할 이미지를 받아와서 irene.jpeg 로 저장했다. 다른 사진을 받아도 상관없지만 코드에 사진 파일명을 적어넣어야 하므로 파일명은 기억해놓자. [사진은 꼭 camera_test 디렉터리 안에 있어야 한다.]

 

 

 


② 코드 작성

 

※ camera_test.cpp

 

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

int main(){
	cv::Mat img;
	img = cv::imread("irene.jpeg", cv::IMREAD_COLOR);
	if(img.empty()){
		std::cout << "No Image" << std::endl;
		return -1;
	
	}
	cv::namedWindow("yaho", cv::WINDOW_AUTOSIZE);
	cv::imshow("yaho", img);
	
	cv::waitKey(0);

}

 

 

 

 

 코드 분석

 

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

 

opencv 라이브러리를 불러오고, 입출력 라이브러리 iostream을 불러온다. opencv.hpp 안에는 core, imgproc, highgui 등의 헤더 파일에 대한 링크가 포함되어 있다. 이 포스트에서 사용한 함수들이 어느 헤더 파일에서 사용된지 알고있다면 개별적으로 지정해도 문제없이 작동한다.

 

 

 

☞ using namespace

 

using namespace std;
using namespace cv;

 

using namespace 는 권장하지 않는다고 하나 대형 프로젝트를 진행하는 것이 아니기 때문에 귀찮다면 사용해도 상관없다.

 

 

 

참고 ☞ https://sexycoder.tistory.com/16

 

[C++] using namespace std를 사용하면 안되는 이유

보통 처음 C++를 시작할 때 헤더파일을 포함하는 전처리문 아래 using namespace std;를 적어서 cout과 cin을 사용한다. 그러나 이는 매우 위험한 선언이며 프로그램이 커질 경우 보수하기가 굉장히 복잡해질 수..

sexycoder.tistory.com

 

 

 

int main(){
	cv::Mat img;
	img = cv::imread("irene.jpeg", cv::IMREAD_COLOR);

 

Mat 클래스는 이미지 포맷에 대한 함수나 메소드를 제공하기 때문에 imgcodecs.hpp 에서 찾을 수 있다. 코드를 보면 메인 함수에서 cv::Mat 의 객체 img 를 생성하고, cv::imread 함수를 이용하여 이전에 다운로드 해놓은 이미지 "irene.jpeg" 파일을 불러올 수 있다.

 

 

 

 

☞ cv::imread

 

void cv::imread(const String &filename, int flags=IMREAD_COLOR)

 

cv::imread의 두 번째 파라미터 flags 자리에 cv::IMREAD_COLOR가 적혀 있는데 이 곳에서 이미지를 어떻게 출력할지 설정할 수 있다. 예를 들어 cv::IMREAD_GRAYSCALE를 입력하면 "irene.jpeg" 이미지가 회색으로 출력이 된다.

 

 

 

pkg-config --cflags opencv4

 

터미널에서 pkg-config 명령어를 사용하면 opencv 패키지의 디렉터리를 확인할 수 있다. 해당 디렉터리로 이동하면 함수들이 담겨 있는 파일을 열람할 수 있는데 잘 찾아보면 제작자의 주석이 담긴 설명을 들여다 볼 수 있다. docs.opencv.org 에서 더 정확하게 확인할 수 있지만, 예전에 랜선을 잃어버려 인터넷 연결을 못하는 상태에서 이렇게 찾아봤던 기억이 생각나서 올려본다.

 

 

 

 

 

 

 

	if(img.empty()){
		std::cout << "No Image" << std::endl;
		return -1;
	
	}

 

 

코드를 작성하다보면 정말 다양하고 말같지도 않은 곳에서 에러가 발생하는데 이런 문구를 하나씩 넣어주는 습관이 생기면 오류 검출에 도움이 된다. 이미지를 인식하지 못한다고 판단했을 때 "No Image" 라는 문구를 출력하여 이미지에 관한 오류임을 알 수 있도록 하자.

 

 

 

 

 

	cv::namedWindow("yaho", cv::WINDOW_AUTOSIZE);
	cv::imshow("yaho", img);
	
	cv::waitKey(0);

 

☞ cv::namedWindow

 

 

cv::namedWindow는 창을 띄워주는 gui에 관련된 함수로 highgui.hpp 파일에서 함수에 대해 찾아볼 수 있다.

 

cv::namedWindow(const String &winname, int flags=WINDOW_AUTOSIZE)

 

첫 매개변수는 생성할 창의 타이틀, 나머지는 창의 크기를 얘기한다. 카메라로 실시간 영상 프레임을 받아올때 창의 크기가 크면 픽셀 수가 많아져 FPS가 매우 느려지는데 그러한 경우에 창 크기를 조절하는 것이 두 번째 매개변수라 할 수 있다. 물론 resize 함수를 사용하여 해결할 수도 있다.

 

 

보는 바와 같이 AUTOSIZE 이외에 NORMAL, FULLSCREEN과 같이 다양한 방법이 있으니 창 출력에 대해 참고하면 좋을 것 같다.

 

 

 

 

☞ cv::imshow

 

void cv::imshow(const String &winname, InputArray mat)

 

첫 매개변수는 마찬가지로 생성할 창의 제목, 나머지는 InputArray 형의 mat이다. imshow 함수를 이용해 출력할 이미지를 넣으라는 의미이다.

 

 

 

cv::waitKey(0)

 

괄호 안에 들어가는 0은 0ms 를 의미하는데 입력 키를 받기 전까지 계속 이미지를 출력한다는 의미이다. waitKey를 입력하지않고 코드 작성을 마무리하면 실행하고 나서 우리가 알지 못할정도로 짧은 순간에 한 번 창이 열리고 닫혀서 실행이 안된 줄로 착각하게 된다. 꼭 넣어주자.

 

 

 imread :  불러오기

 

 imshow : 출력하기

 

 imwrite : 저장하기

 

 

이미지 입출력에 관련된 3개의 함수가 있다. image의 앞 두 철자를 따서 모두 앞에 im이 붙는다. imread와 imshow가 입출력을 담당하는 함수여서 많이 쓴다. imwrite는 캘리브레이션 할 때 해당 카메라로 사진을 찍어야했기 때문에 사용했던 기억이난다.

 

 

 


③ CMAKE

 

cd ..
[편집기] CMakeLists.txt

 

짧고 간단한 코드는 makefile 을 직접 만들어서 실행 파일을 만들어 주는 것이 간단하지만 보통은 큰 프로젝트를 목표로 작업을 진행하기 때문에 cmake 처럼 좋은 툴을 사용하는게 좋다. 예전에 아무것도 모르던 시절 혼자 make를 해보려고 g++ -O main.cpp -lopencv_highgui 이런 식으로 g++ 컴파일을 시도하는데 계속 라이브러리 링크가 안되어서 고생을 했던 기억이 있다.

 

코드 작성을 마무리했다면 workspace/camera_test/src 디렉터리에 있을 것이다. 터미널 창에서 cd .. 를 입력하여 상위 디렉터리인workspace/camera_test 로 돌아오고 편집기로 CMakeLists.txt 를 작성하자.

 

 

 

◎ cmake_minimum_required : cmake 최소 요구 버전

◎ project : 프로젝트 이름

◎ find_package : 프로젝트에 사용될 패키지

◎ add_executable : 프로그램화될 소스코드(실행 파일 생성)

◎ target_link_libraries :  링크할 라이브러리

 

 

add_executable과 target_link_libraries의 camera_test 부분에는 ${PROJECT_NAME} 환경 변수를 넣어도 문제 없이 작동한다. 작성을 완료하고 cmake와 make를 진행한다.

 

 

 

cmake .
make

 

 

 

 

 

 


④ 실행 결과

 

 

 

./camera_test

 

 

 

 

 

반응형