리눅스에서 이클립스로 opencv 사용하기

리눅스에서 이클립스로 opencv 사용하기

2020, Mar 08    


  • 참조1 : https://agiantmind.tistory.com/182
  • 참조2 : https://webnautes.tistory.com/1186
  • 참조3 : https://docs.opencv.org/3.4/d7/d9f/tutorial_linux_install.html
  • 이번 글에서는 리눅스에서 이클립스를 이용하여 OpenCV C++ 버전을 사용하는 방법에 대하여 정리하겠습니다.


목차


  • 이클립스 설치

  • OpenCV 설치

  • 이클리스에서 OpenCV 연동하기

  • 터미널에서 OpenCV 연동 컴파일 및 실행


이클립스 설치


  • 먼저 이클립스를 설치하도록 하겠습니다. 다른 IDE도 많이 있지만 이클립스 만의 장점이 있으니 사용해 보시기를 추천 드립니다.
  • 이클립스를 이용하면 환경 세팅하는 것이 편하고 디버깅 모드도 쉽게 동작시킬 수 있습니다.
  • 먼저 이클립스는 자바 환경에서 동작하기 때문에 JRE(Java Runtime Environment) 또는 JDK(Java Development Kit)을 설치하여 자바 환경이 동작할 수 있도록 만들어 주어야 합니다.
  • 이 글에서는 JRE를 설치해 보도록 하겠습니다.


sudo apt install default-jre


  • 그 다음으로 C/C++ 개발 관련 패키지 설치를 해보겠습니다. 다음 명령어를 통하여 설치를 완료합니다.


sudo apt-get install build-essential


  • 이제 이클립스가 구동될 수 있는 환경이 만들어 졌으므로 이클립스를 설치해 보도록 하겠습니다.
  • 이클립스 버전 중에 CDT라는 버전을 설치해야 C/C++이 지원이 됩니다. (Eclipse IDE for C/C++ Developers) 아래 링크를 이용해서 최신 버전을 깔아보시기 바랍니다.
    • https://www.eclipse.org/downloads/packages/release/2019-12/r/eclipse-ide-cc-developers?
  • 설치할 때에는 설치할 리눅스 버전에 맞게 설치하면 됩니다. 제가 사용하는 리눅스 버전은 64bit linux이므로 64bit linux용 이클립스를 설치하면 됩니다.
  • 받은 파일의 형태가 tar.gz 이면 tar -xvzf 압축파일을 이용하여 압축을 해제하면 됩니다.
  • 압축을 풀고 나면 eclipse라는 폴더가 생기게 됩니다. 이 폴더를 root 아래의 /opt로 이동시키겠습니다.


sudo mv eclipse /opt


  • 터미널 실행 설정에 대한 세팅을 입력 합니다.
  • CUI 환경에서 입력하려면 다음 명령어를 입력합니다.
    • sudo vi /usr/bin/eclipse
  • GUI 환경에서 입력하려면 다음 명령어를 입력합니다.
    • sudo gedit /usr/bin/eclipse


  • 열린 vi 또는 gedit에서 다음을 입력합니다.


#! /bin/sh
export ECLIPSE_HOME=/opt/eclipse
$ECLIPSE_HOME/eclipse $*


  • 바로가기 설정에 대한 권한 설정을 해줍니다.


sudo chmod 755 /usr/bin/eclipse


  • 만약 X윈도우에서 바로가기 설정이 필요하다면 아래처럼 입력해 주면 됩니다.
  • vi 사용 : sudo vi /usr/share/applications/eclipse.desktop
  • gedit 사용 : sudo gedit /usr/share/applications/eclipse.desktop


[Desktop Entry]

Encoding=UTF-8
Name=Eclipse
Comment=Eclipse IDE
Exec=eclipse
Icon=/opt/eclipse/icon.xpm
Terminal=false
Type=Application
Categories=Development
StartupNotif=true


  • 이제 기본적인 이클립스 세팅은 끝났습니다. 이제 이클립스를 한번 실행해 보도록 하겠습니다.
  • 이클립스를 실행하면 CDT 관련 설치 목록이 뜰 수도 있고 아닐 수도 있습니다.
  • 만약 CDT 관련 설치 목록이 생긴다면 관련 목록을 설치해 주면 됩니다. 만약 따로 설치 목록이 뜨지 않는다면 다음 경로로 들어가서 설치해 보도록 하겠습니다.
    • 이클립스 우측 상단의 help - Install New Software를 클릭합니다.
    • Work with 란에 CDT라고 입력하면 CDT Main FeaturesCDT Optional Features가 뜹니다.
    • 이 두 항목을 클릭한 다음에 Next를 눌러서 설치를 진행합니다.
  • 이제 준비는 끝났습니다. C 또는 C++ 프로젝트를 생성해서 코드를 돌려봐서 정상 설치 되었는 지 확인하면 됩니다.
  • 프로젝트를 생성할 때, Toolchains로 선택해야 하는 항목이 있는데 Linux GCC를 사용하면 됩니다.
  • 프로젝트에서 왼쪽 상단의 망치 모양이 build입니다. build 후 run 하면 코드를 실행할 수 있습니다.


Drawing


  • 프로젝트에서 위 그림처럼 stop 심볼 오른쪽에 RunDebug가 정상적으로 세팅이 되어 있는지 확인 후 build 및 run을 하시기 바랍니다.
  • 정상적으로 코드가 실행되었다면 이제 OpenCV를 설치하도록 해보겠습니다.


OpenCV 설치


  • OpenCV를 설치 하기 전에 현재 컴퓨터에 OpenCV가 설치되어 있는 지 먼저 확인해 보도록 하겠습니다.
  • 기존에 설치되어 있는 OpenCV가 있으면 새로 설치하는 버전이 정상적으로 동작하지 않을 수 있기 때문입니다.
  • 다음 명령어를 입력하여 설치 되어 있는 OpenCV 버전을 확인해 보시기 바랍니다.


pkg-config --modversion opencv


  • 만약 커맨드 결과로 특정 버전이 나온다면 기존에 특정 버전이 설치된 것으로 보면 됩니다.
    • 예를 들어 3.4.2 처럼 설치된 버전이 출력되게 됩니다.
  • 반면 설치되어 있는 버전이 없으면 다음의 출력이 터미널에 나오게 됩니다.


Package opencv was not found in the pkg-config search path.
Perhaps you should add the directory containing `opencv.pc'
to the PKG_CONFIG_PATH environment variable
No package 'opencv' found


  • 만약 현재 설치된 opencv 파일 및 설정등을 삭제하려면 다음 명령어를 차례대로 입력 합니다.


  • sudo apt-get purge libopencv* python-opencv
  • sudo apt-get autoremove
  • sudo find /usr/local/ -name "*opencv*" -exec rm -i {} \;


  • 이제 초기화된 상태에서 OpenCV를 설치해 보도록 하겠습니다.
  • 먼저 기존에 설치된 패키지들의 새로운 버전이 저장소에 있다면 리스트를 업데이트 하기 위해 다음 명령어를 입력합니다.
    • sudo apt-get update


  • 기존에 설치된 패키지의 새로운 버전이 있으면 업그레이드를 진행합니다.
    • sudo apt-get upgrade


  • 지금부터 설치하는 것들은 OpenCV를 컴파일 하기 전에 필요한 패키지를 설치하는 단계입니다.
  • 패키지 내용을 하나하나 살펴보려면 아래 글을 쭉 살펴보면서 설치하시고 그렇지 않고 그냥 한번에 설치하려면 다음 커맨드를 입력하시기 바랍니다.


sudo apt-get install cmake pkg-config libjpeg-dev libtiff5-dev libpng-dev libavcodec-dev libavformat-dev libswscale-dev libxvidcore-dev libx264-dev libxine2-dev libv4l-dev v4l-utils libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libgtk2.0-dev mesa-utils libgl1-mesa-dri libgtkgl2.0-dev libgtkglext1-dev libatlas-base-dev gfortran libeigen3-dev python2.7-dev python3-dev python-numpy python3-numpy


  • 먼저 cmake를 설치하도록 하겠습니다. cmake는 컴파일 옵션이나 빌드된 라이브러리에 포함시킬 OpenCV 모듈 설정등을 위해 필요합니다.
    • sudo apt-get install cmake


  • 그 다음 pkg-config를 설치하도록 하겠습니다.
  • pkg-config는 프로그램 컴파일 및 링크시 필요한 라이브러리에 대한 정보를 메타파일(확장자가 .pc 인 파일)로부터 가져오는데 사용됩니다. 터미널에서 특정 라이브러리를 사용한 소스코드를 컴파일시 필요한 컴파일러 및 링커 플래그를 추가하는데 도움이 됩니다.
    • sudo apt-get install pkg-config


  • 다음은 특정 포맷의 이미지 파일을 불러오거나 기록하기 위해 필요한 패키지들입니다.
    • sudo apt-get install libjpeg-dev libtiff5-dev libpng-dev


  • 다음은 특정 코덱의 비디오 파일을 읽어오거나 기록하기 위해 필요한 패키지들입니다.
    • sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libxvidcore-dev libx264-dev libxine2-dev


  • Video4Linux 패키지는 리눅스에서 비디오 캡처를 지원하기 위한 디바이스 드라이버와 API를 포함하고 있습니다.
    • sudo apt-get install libv4l-dev v4l-utils


  • GStreamer는 비디오 스트리밍을 위한 라이브러리입니다.
    • ` sudo apt-get install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev`


  • OpenCV에서는 highgui 모듈을 사용하여 자체적으로 윈도우 생성하여 이미지나 비디오를 보여줄 수 있습니다. 윈도우 생성 등의 GUI를 위해 gtk 또는 qt를 선택해서 사용가능합니다. 여기서는 gtk2를 지정해주었습니다.
    • sudo apt-get install libgtk2.0-dev


  • OpenGL 지원하기 위해 필요한 라이브러리입니다.
    • sudo apt-get install mesa-utils libgl1-mesa-dri libgtkgl2.0-dev libgtkglext1-dev


  • OpenCV 최적화를 위해 사용되는 라이브러리들입니다.
    • sudo apt-get install libatlas-base-dev gfortran libeigen3-dev


  • python2.7-dev와 python3-dev 패키지는 OpenCV-Python 바인딩을 위해 필요한 패키지들입니다. Numpy는 매트릭스 연산등을 빠르게 처리할 수 있어서 OpenCV에서 사용됩니다.
    • sudo apt-get install python2.7-dev python3-dev python-numpy python3-numpy



  • 이제 OpenCV 설정과 컴파일 및 설치하는 방법에 대하여 알아보도록 하겠습니다.
  • 먼저 OpenCV 소스 코드를 저장할 임시 디렉토리를 생성하겠습니다.
    • mkdir opencv
    • cd opencv
  • opencv 폴더에 opencv 소스 코드를 다운 받아서 저장하고 압축을 풉니다. (버전은 선택)
    • 버전 4 예시 : wget -O opencv.zip https://github.com/opencv/opencv/archive/4.0.1.zip
    • 버전 3 예시 : wget -O opencv.zip https://github.com/opencv/opencv/archive/3.4.2.zip
    • unzip opencv.zip
  • opencv_contrib(extra modules) 소스코드를 다운로드 받아 압축을 풀어줍니다. (버전은 선택)
    • 버전 4 예시 : wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.0.1.zip
    • 버전 3 예시 : wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/3.4.2.zip
    • unzip opencv_contrib.zip
  • 앞으로 예제는 버전 4를 예시로 진행하겠습니다. 그러면 다음 두 개의 디렉토리가 생성됩니다.
    • opencv 폴더 안에서 ls -d */를 실행하면 opencv-4.0.1/ opencv_contrib-4.0.1/가 있는 것을 확인할 수 있습니다.
  • 그 다음 opencv-4.0.1 디렉토리로 이동하여 build 디렉토리를 생성하고 build 디렉토리로 이동합니다. 컴파일은 build 디렉토리에서 이루어집니다.
    • cd opencv-4.0.1/
    • mkdir build
    • cd build


  • build 디렉토리 안에서 cmake를 사용하여 OpenCV 컴파일 설정을 해줍니다.


  • 기본 기능들만 설치하려면 다음 설정을 터미널에 입력합니다. 이 설정은 opencv_contrib 및 추가 기능 없이 기본 기능한 설치합니다.


cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..


  • 아래 세팅을 하면 필요한 거의 모든 기능을 다 설치하게 됩니다.


cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D WITH_TBB=OFF \
-D WITH_IPP=OFF \
-D WITH_1394=OFF \
-D BUILD_WITH_DEBUG_INFO=OFF \
-D BUILD_DOCS=OFF \
-D INSTALL_C_EXAMPLES=ON \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D BUILD_EXAMPLES=OFF \
-D BUILD_TESTS=OFF \
-D BUILD_PERF_TESTS=OFF \
-D WITH_QT=OFF \
-D WITH_GTK=ON \
-D WITH_OPENGL=ON \
-D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-4.0.1/modules \
-D WITH_V4L=ON  \
-D WITH_FFMPEG=ON \
-D WITH_XINE=ON \
-D BUILD_NEW_PYTHON_SUPPORT=ON \
-D OPENCV_GENERATE_PKGCONFIG=ON ../


  • 만약 파이썬에 대한 경로가 없으면 아래 명령어도 추가하시면 됩니다. 단, 아래 명령어는 실제 컴퓨터에서의 경로와 일치하는 것이 있는 지 확인하시기 바랍니다.


-D PYTHON2_INCLUDE_DIR=/usr/include/python2.7 \
-D PYTHON2_NUMPY_INCLUDE_DIRS=/usr/lib/python2.7/dist-packages/numpy/core/include/ \
-D PYTHON2_PACKAGES_PATH=/usr/lib/python2.7/dist-packages \
-D PYTHON2_LIBRARY=/usr/lib/x86_64-linux-gnu/libpython2.7.so \
-D PYTHON3_INCLUDE_DIR=/usr/include/python3.6m \
-D PYTHON3_NUMPY_INCLUDE_DIRS=/usr/lib/python3/dist-packages/numpy/core/include/  \
-D PYTHON3_PACKAGES_PATH=/usr/lib/python3/dist-packages \
-D PYTHON3_LIBRARY=/usr/lib/x86_64-linux-gnu/libpython3.6m.so \


  • 위 cmake 명령어가 성공적으로 동작하면 다음 출력을 볼 수 있습니다.


-- Configuring done
-- Generating done
-- Build files have been written to: /home/webnautes/opencv/opencv-4.0.1/build


  • 앞에서 cmake를 이용하여 컴파일 설정을 완료하였으면 컴파일을 해야합니다.
  • 컴파일을 시작하기 전에 사용 중인 컴퓨터의 CPU 코어수를 확인합니다.
    • cat /proc/cpuinfo | grep processor | wc -l
    • 결과로 4가 나오면 사용중인 CPU의 코어수가 4입니다.
  • opencv/opencv-4.0.1/build 경로에서 make 명령을 사용하여 컴파일을 시작합니다. -j 다음에 위에서 확인한 숫자를 붙여서 실행해줍니다. 앞에 time을 붙여서 실행하면 컴파일 완료 후 걸리는 경과를 알려줍니다.
    • time make -j4
  • 이제 컴파일을 완료하였으므로 컴파일 결과물을 설치합니다.
    • sudo make install
  • 그 다음 cat /etc/ld.so.conf.d/* 명령어를 터미널에서 입력하여 출력물에서 /usr/local/lib 를 포함하는 설정 파일이 있는 지 확인합니다.
  • /usr/local/lib이 출력되지 않았다면 다음 명령을 추가로 실행합니다.
    • sudo sh -c 'echo '/usr/local/lib' >
  • 마지막으로 컴파일 시 opencv 라이브러리를 찾을 수 있도록 다음 명령을 실행합니다.
    • sudo ldconfig


OpenCV 설치 결과 확인


  • 이클립스에서 실제로 코드를 돌려보기 이전에 코드가 잘 설치되었는 지 확인이 필요합니다.
  • 다음 명령어를 이용하여 예제를 컴파일 해보도록 하겠습니다.
    • 아래 명령어를 그대로 실행하지 말고 실제 경로에 맞추셔야 합니다. 예를 들어 /usr/local/share/opencv4/에서 opencv4가 아니라 버전에 따라 다른 이름이 있을 수도 있습니다.
    • 두번째로 pkg-config에서의 opencv4는 버전에 맞게 지정해주시면 됩니다. opencv-4.x.x 이면 opencv4를 하면 되고 opencv-3.x.x이면 opencv3을 하면 됩니다.
    • g++ -o facedetect /usr/local/share/opencv4/samples/cpp/facedetect.cpp $(pkg-config opencv4 --libs --cflags)
  • 컴파일이 완료 되었으면 다음 코드를 실행해 보시기 바랍니다. 컴파일 할 때와 동일하게 경로 지정을 조금 변경하신 후 실행해 보시기 바랍니다.
    • ./facedetect --cascade="/usr/local/share/opencv4/haarcascades/haarcascade_frontalface_alt.xml" --nested-cascade="/usr/local/share/opencv4/haarcascades/haarcascade_eye_tree_eyeglasses.xml" --scale=1.3
  • 마지막으로 컴파일에 사용하였던 opencv 소스코드 디렉토리를 삭제하셔도 됩니다.


이클리스에서 OpenCV 연동하기


  • 앞에서 이클립스도 설치하였고 OpenCV도 설치하였으므로 이제 이클립스와 OpenCV를 연동해 보도록 하겠습니다.
  • 이클립스에서 임의의 프로젝트를 열고 Project Explorer를 오른쪽 클릭하여 Properties를 들어가서
  • C/C++ BuildSettings를 클릭합니다. 그 다음 Tool Settings 탭을 보겠습니다.
  • 탭 안에 보면 크게 GCC C++ Compiler, GCC C Compiler 그리고 GCC C++ Linker가 있습니다.
  • 먼저 GCC C++ Compiler 부분을 살펴보도록 하겠습니다.
    • DialectLanguage standardISO C++ 11
    • IncludeInclude paths에 opencv 또는 opencv2가 설치 된 폴더의 위치를 입력 합니다. 보통 /usr/local/include/가 됩니다.
      • 제 pc에서 opencv4를 설치하였을 때 /usr/local/include/opencv4/ 까지 가면 그 안에 opencv2가 있었기 때문에 /usr/local/include/opencv4/까지 입력하였습니다. pc마다 다르니 참조하시기 바랍니다.
    • 원활한 동작을 위하여 Optimizationoptimization level-o2로 입력합니다.
  • 다음으로 GCC CCompiler 부분도 C++과 유사하게 설정해 주면 됩니다.
    • DialectLanguage standardISO C99
    • IncludeInclude paths에 opencv가 설치 된 폴더의 위치를 입력 합니다. 보통 /usr/local/include/가 됩니다. (여기서도 GCC C++ Compiler와 동일한 방법으로 입력해 주시면 됩니다.)
    • 원활한 동작을 위하여 Optimizationoptimization level-o2로 입력합니다.
  • 마지막으로 GCC C++ Linker를 추가해 주겠습니다. LibrariesLibraries에 아래 내용들을 추가하면 됩니다.
    • opencv_core
    • opencv_imgcodecs
    • opencv_highgui
    • opencv_imgproc


터미널에서 OpenCV 연동 컴파일 및 실행


  • 앞에서 opencv 설치를 완료 하였다는 가정 하에, 이클립스 대신 터미널 창에서 바로 OpenCV를 연동하여 바로 컴파일 및 실행하는 방법에 대하여 알아보겠습니다.
  • c 파일을 컴파일 하려면 gcc를 사용하시면 되고 cpp 파일을 컴파일 하려면 g++을 사용하시면 됩니다. 편의상 gcc로 두고 설명하겠습니다.
  • 실행 명령어 : gcc -o "run_file" "src_file" $(package)
  • 예를 들면 gcc -o test test.c $(pkg-config --libs --cflags opencv) 로 할 수 있습니다. 해석하면 현재 경로에 test 라는 실행 파일을 생성하는 데, 코드는 test.c를 이용한다는 뜻입니다. 이 때, pkg-config --libs --cflags opencv를 패키지로 이용하여 컴파일을 한다는 뜻입니다.
  • 이 명령어를 입력하면 현재 경로에 test라는 실행 파일이 생깁니다. 이 파일을 실행하면 됩니다.
  • 물론 원하는 경로에 실행 파일을 생성할 수 있고 원하는 경로의 코드를 불러올 수 있습니다. 그러면 예를 들어 다음과 같이 변경할 수 있습니다.
    • 예 : gcc -o /home/gaussian37/test /home/gaussian37/test.c $(pkg-config --libs --cflags opencv)


  • 추가적으로 (pkg-config --libs --cflags opencv)에 대하여 설명드리겠습니다. opencv가 설치된 리눅스 환경의 터미널에서 다음 명령어를 입력해 보시기 바랍니다. 아래 설명은 제 컴퓨터 기준이므로 각자의 컴퓨터에 opencv가 설치된 환경에 따라서 출력물이 다를 수 있습니다.
  • 명령어 1 : pkg-config --libs opencv
    • 출력 : -L/usr/local/lib -lopencv_stitching -lopencv_superres -lopencv_videostab -lopencv_aruco -lopencv_bgsegm -lopencv_bioinspired -lopencv_ccalib -lopencv_dnn_objdetect -lopencv_dpm -lopencv_face -lopencv_photo -lopencv_freetype -lopencv_fuzzy -lopencv_hfs -lopencv_img_hash -lopencv_line_descriptor -lopencv_optflow -lopencv_reg -lopencv_rgbd -lopencv_saliency -lopencv_stereo -lopencv_structured_light -lopencv_phase_unwrapping -lopencv_surface_matching -lopencv_tracking -lopencv_datasets -lopencv_text -lopencv_dnn -lopencv_plot -lopencv_xfeatures2d -lopencv_shape -lopencv_video -lopencv_ml -lopencv_ximgproc -lopencv_calib3d -lopencv_features2d -lopencv_highgui -lopencv_videoio -lopencv_flann -lopencv_xobjdetect -lopencv_imgcodecs -lopencv_objdetect -lopencv_xphoto -lopencv_imgproc -lopencv_core
    • 의미 : 컴파일 할 때 사용할 라이브러리 파일 목록입니다.
  • 명령어 2 : pkg-config --cflags opencv
    • 출력 : -I/usr/local/include/opencv -I/usr/local/include
    • 의미 : opencv가 설치된 패키지의 경로를 나타냅니다. `