Home [데브코스] 17주차 - CMake OpenCV, Eigen, Pangolin install
Post
Cancel

[데브코스] 17주차 - CMake OpenCV, Eigen, Pangolin install


CMake

CMake란 cross platform으로 window, ubuntu, MacOS 등 다양한 운영 체제에서 사용이 가능하다. CMake를 활용하여 C++ 작업 공간을 구축할 수 있다.

내용 추가 예정


CMake install

  • IDE : Clion
  • Project name : hello_cmake
  • build tools : WSL2 ubuntu 18.04
  • terminal : WSL2 ubuntu 18.04



Package install

Directory

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
project
  ⊢ CMakeLists.txt
  ⊢ examples
    ⊢ example1.cpp
    ⊢ example2.cpp
    ⊢ ...
  ⊢ modules
    ⊢ module1
      ⊢ module1
        ∟ include
          ∟ Class.hpp
      ⊢ src
        ∟ Class.cpp
      ∟ CMakeLists.txt
    ⊢ module2
      ⊢ module2
        ∟ include
          ∟ Class.hpp
      ⊢ src
        ∟ Class.cpp
      ∟ CMakeLists.txt
    ⊢ ...
  ⊢ main.cpp
  ∟ thirdparty
    ⊢ OpenCV
      ⊢ build
      ⊢ install
      ∟ opencv
    ∟ Eigen
      ⊢ build
      ⊢ install
      ∟ eigen

 

OpenCV install

OpenCV를 사용하기 위해서는 CMake 작업 공간에 OpenCV 라이브러리를 구성해야 한다.

1
2
3
4
5
6
7
8
hello_cmake$ mkdir thirdParty && cd thirdParty
thirdParty$ mkdir -P OpenCV/build && mkdir -P OpenCV/install
thirdParty$ cd OpenCV
OpenCV$ git clone https://github.com/opencv/opencv.git
OpenCV$ cd build
build$ cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=../install/ ../opencv/
build$ make -j4
build$ sudo make install

이렇게 OpenCV 라이브러리를 설치할 깃허브 레포지토리를 클론하고, 디렉토리를 구축한다.

 

이 때, cuda와 같은 contrib 를 함께 사용하고자 한다면, 다음과 같이 설정해야 한다.

1
2
3
4
5
6
7
8
9
10
11
12
build$ export "pathToPython=<python Path>" && export "pyVer=39"
build$ cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=../install/ \
-DOPENCV_EXTRA_MODULES_PATH="C:/opencv/opencv_contrib/modules" \
-DBUILD_opencv_world=ON -DWITH_CUDA=ON \
-DCUDA_TOOLKIT_ROOT_DIR="C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v11.6" \
-DCUDA_FAST_MATH=ON -DWITH_CUBLAS=ON -DCUDA_ARCH_BIN=8.6 -DWITH_NVCUVID=ON \
-DWITH_OPENGL=ON -DWITH_MFX=ON -DBUILD_opencv_python3=ON \
-DPYTHON3_INCLUDE_DIR=%pathToPython%/include \
-DPYTHON3_LIBRARY=%pathToPython%/libs/python%pyVer%.lib \
-DPYTHON3_EXECUTABLE=%pathToPython%/python.exe -DPYTHON3_NUMPY_INCLUDE_DIRS=%pathToPython%/lib/site-packages/numpy/core/include \
-DPYTHON3_PACKAGES_PATH=%pathToPython%/Lib/site-packages/ -DOPENCV_SKIP_PYTHON_LOADER=ON \
-DOPENCV_CONFIG_PATH=C:/opencv/opencv/install/x64/vc17/bin  ../opencv/

pathToPython에는 자신의 python.exe 경로를 넣으면 된다. 그리고, pyVer도 본인의 python 버전에 맞게 넣는다.



Eigen install

1
2
3
4
5
6
7
8
9
thirdParty$ mkdir Eigen3
thirdParty$ cd Eigen3
Eigen3$ mkdir build
Eigen3$ mkdir install
Eigen3$ git clone https://gitlab.com/libeigen/eigen.git
Eigen3$ cd build
build$ cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=../install ../eigen/
build$ make -j4
build$ sudo make install



Pangolin install

1
2
3
4
5
6
7
thirdParty$ mkdir pangolin && cd pangolin
pangolin$ git clone https://github.com/stevenlovegrove/Pangolin.git
pangolin$ sudo apt install build-essential
pangolin$ sudo apt install libgl1-mesa-dev
pangolin$ sudo apt install libglew-dev
pangolin$ mkdir build && mkdir install
pangolin$ cd build

 

이렇게 작업공간을 다 생성한 후에는 cmake build를 진행한다. 동일하게 make -j에서 4는 코어 수이므로 자신의 컴퓨터에 맞게 설정해주면 된다.

1
2
3
build$ cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=../install/ ../Pangolin/
build$ make -j4
build$ sudo make install

 

 

CMakeLists.txt

  • project/CMakeLists.txt
cmake_minimum_required(VERSION 3.22)
project(hello_cmake LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 14) # set은 어떤 변수에 값을 넣어주는 것, CMAKE_CXX_STANDARD에 14를 넣는다.
set(CMAKE_CXX_STANDARD_REQUIRED ON) # CMAKE_ 는 종복 변수, 14를 넘어가는 기능들은 빌드가 되지 않도록 함.

add_subdirectory(modules)

add_executable(hello_cmake main.cpp) # 실행파일을 의미한다. 이런 실행파일을 만들 instructure를 추가하겠다.
                                     # add_executable(실행파일의 이름, 프로그램을 만드는데 필요한 소스코드)

# examples/exec_module1.cpp 를 실행하는 코드
add_executable(exec_module1
        examples/exec_module1.cpp
        )

# exec_module1에 library를 링크
target_link_libraries(exec_module1 PUBLIC
        module1
        )

add_executable(exec_module1_module2 examples/exec_module1_module2.cpp)

target_link_libraries(exec_module1_module2 PUBLIC
        module1
        module2
        )

 

  • project/modules/CMakeLists.txt
add_subdirectory(module1)
add_subdirectory(module2)

 

  • project/modules/module1/CMakeLists.txt
cmake_minimum_required(VERSION 3.22)
cmake_policy(SET CMP0111 OLD)
project(module1 LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

set(MODULE1_SOURCE_FILES # name
        src/ClassMat.cpp
        )

add_library(module1 # library name
        ${MODULE1_SOURCE_FILES}    # add all files in MODULE1_SOURCE_FILES
        )

# OpenCV package
find_package(OpenCV REQUIRED HINTS ${CMAKE_SOURCE_DIR}/thirdParty/OpenCV/install/lib/cmake/opencv4)

# if find, print directory
if (OpenCV_FOUND)
    message(STATUS "OpenCV Found! - ${OpenCV_DIR}")
endif()

# header file directory
target_include_directories(module1 PUBLIC
        include # directory
        ${OpenCV_INCLUDE_DIRS}
        )

# library link - library link in module1
target_link_libraries(module1 PUBLIC
        ${OpenCV_LIBS}
        )

 

  • project/modules/module2/CMakeLists.txt
cmake_minimum_required(VERSION 3.22)
project(module2 LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

set(MODULE2_SOURCE_FILES # name
        src/ClassEigenMat.cpp
        )

add_library(module2 # library name
        ${MODULE2_SOURCE_FILES}    # add all files in MODULE1_SOURCE_FILES
        )

find_package(Eigen3 REQUIRED HINTS ${CMAKE_SOURCE_DIR}/thirdParty/Eigen3/install/share/eigen3/cmake) # .cmake 파일 위치

if (Eigen3_FOUND)
    message(STATUS "Eigen3 Found! - ${Eigen3_DIR}")

    set(Eigen3_LIBS Eigen3::Eigen)
endif()

target_include_directories(module2 PUBLIC # header file directory
        include # directory
        ${Eigen3_INCLUDE_DIRS}
        )

target_link_libraries(module2 PUBLIC # library link
        ${Eigen3_LIBS}
        )

 

 

Pangolin 에러

  • GLEW 오류

cmakeCould not find GLEW 라는 에러가 발생할 수 있다. 이에 대해 libglew-dev 를 설치해서 해결해준다.

1
sudo apt install libglew-dev

 

  • so파일 오류
  1. LD_LIBRARY_PATH 추가

.bash_profile에 LD_LIBRARY_PATH를 추가해서 경로를 추가한다.

1
2
3
$ sudo gedit ~/.bash_profile

LD_LIBRARY_PATH=/mnt/c/Users/dkssu/CLionProjects/Trajectory/thirdparty/Pangolin/install/lib
1
$ source ~/.bash_profile

 

1
2
echo $LD_LIBRARY_PATH
/mnt/c/Users/dkssu/CLionProjects/Trajectory/thirdparty/Pangolin/install/lib

 

이렇게 환경변수가 등록되었다면, 이 경로를 실제 시스템에 등록한다.

1
sudo ldconfig

 

나의 경우는 이렇게 해도 실행이 되지 않아서 상대경로를 실제 경로로 수정했다.

1
std::string trajectory_file = "/mnt/c/Users/dkssu/CLionProjects/Trajectory/examples/trajectory.txt";

 

  • PlotTrajectory 예시

github

 

 

  1. ld.so.conf 수정

1번 방법이 안된다면 ld.so.conf 파일을 수정한다.

1
2
$ more /etc/ld.so.conf
include /etc/ld.so.conf.d/*.conf

이 값은 /etc/ld.so.conf 파일에 설정되어 있는 값이다. .conf 에 해당하는 모든 파일의 내용이 포함되어 있다. 이에 대해 새로운 라이브러리의 경로를 추가해줘야 한다. 일단 프로젝트에 필요한 *.so 파일을 확인한다.

1
2
3
4
5
$ ls thirdparty/Pangolin/install/lib
cmake                 libpango_glgeometry.so    libpango_plot.so    libpango_vars.so
libpango_core.so      libpango_image.so         libpango_python.so  libpango_video.so
libpango_display.so   libpango_opengl.so        libpango_scene.so   libpango_windowing.so
libpango_geometry.so  libpango_packetstream.so  libpango_tools.so   libtinyobj.so

이 경로를 /etc/ld.so.conf에 추가해준다.

1
2
3
$ cd /etc/ld.so.conf && sudo gedit pangolin.conf

/mnt/c/Users/dkssu/CLionProjects/Trajectory/thirdparty/Pangolin/install/lib

그 후, ldconfig 명령어로 시스템에 등록한다.

1
$ sudo ldconfig

 

 

reference

  • so 파일 오류
    • https://m.blog.naver.com/younguk0907/222084800809
    • https://the-masked-developer.github.io/wiki/no-so-file/
This post is licensed under CC BY 4.0 by the author.