☞ 메인보드 : Jetson Nano Developer Kit
☞ 운영 체제 : Ubuntu 18.04 - JetPack 4.3
☞ 언어 : C++
목차
○ 2. 코드 작성
○ 3. CMAKE
이전 포스트에서는 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
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
'IT > OPENCV' 카테고리의 다른 글
[OPENCV] 6. 이미지 프로세싱(2) - 샤프닝 & 가장자리 검출 (0) | 2021.05.08 |
---|---|
[OPENCV] 5. 색 공간 모델 HSV (3) | 2021.03.14 |
[OPENCV] 4. 이미지 프로세싱(1) - 블러링 (0) | 2020.12.13 |
[OPENCV] 3. OpenCV 실시간 영상 촬영 (6) | 2020.02.06 |
[OPENCV] 1. Jetson Nano 보드 ubuntu 18.04에서 OpenCV 설치 및 CUDA 빌드 (23) | 2020.01.22 |