[OpenCV] Ubuntu에서 local에 OpenCV를 설치하고 C++에서 사용하는 방법
Ubuntu에서 OpenCV를 설치하는 경우, 보통 시스템 폴더 안 (ex. usr/local/include) 에 설치되게 된다. 만약 다른 버전의 OpenCV를 설치하고자 하는 경우 시스템 폴더 안의 OpenCV를 삭제하고 다시 설치하게 되
suho0515.tistory.com
위의 블로그 게시물을 참고하였다.
ROS 환경에서 다양한 open source package를 사용하다 보면
opencv의 버전이 달라 문제가 발생하는 경우가 생기게 된다.
나의 경우 VINS-Mono는 opencv 3.3.1에서 정상적으로 작동하지만
해당 버전을 사용할 경우 realsense의 사용에서 문제가 발생하였다.
따라서 각각 다른 opencv를 적용하여 실행시키는 법을 정리한다.
우선 작업할 workspace를 생성한다.
$ cd ~
$ mkdir catkin_ws_opencv_version
$ cd catkin_ws_opencv_version
$ mkdir src
$ cd src
$ catkin_init_workspace
$ catkin_create_pkg opencv_version_test roscpp
$ cd opencv_version_test
$ cd ~/catkin_ws_opencv_version
$ catkin build
$ source devel/setup.bash
test용 cpp파일을 생성한다.
해당 c++파일에 적용되는 opencv버전을 확인할 수 있는 프로그램을 작성할 것인데
우선 opencv의 경로를 지정하지 않은, opencv를 사용하지 않는 프로그램을 작성하여 정상 작동을 확인한 후 opencv 경로를 추가해주겠다.
$ cd ~/catkin_ws_opencv_version/src/opencv_version_test/src
$ gedit opencv_version_test.cpp
#include <ros/ros.h>
#include <iostream>
//#include "opencv2/opencv.hpp"
int main(int argc, char** argv) {
ros::init(argc, argv, "opencv_version_test");
ros::NodeHandle nh;
//std::cout << "OpenCV version : " << CV_VERSION << std::endl;
return 0;
}
이제 CMakeLists.txt 를 수정한다.
cmake_minimum_required(VERSION 2.8.3)
project(opencv_version_test)
## Compile as C++11, supported in ROS Kinetic and newer
# add_compile_options(-std=c++11)
find_package(catkin REQUIRED COMPONENTS roscpp)
catkin_package()
include_directories(${catkin_INCLUDE_DIRS})
add_executable(opencv_version_test src/opencv_version_test.cpp)
target_link_libraries(opencv_version_test ${catkin_LIBRARIES})
여기까지 완료되었으면 Build를 진행하여 정상적으로 작동하는지 확인한다.
$ cd ~/catkin_ws_opencv_version
$ catkin build
잘 된다면 이제 opencv를 추가하여 프로그램을 구성하여보자.
우선 CMakeLists.txt파일을 아래와 같이 수정해준다.
cmake_minimum_required(VERSION 2.8.3)
project(opencv_version_test)
## Compile as C++11, supported in ROS Kinetic and newer
# add_compile_options(-std=c++11)
find_package(catkin REQUIRED COMPONENTS roscpp)
find_package(OpenCV REQUIRED)
catkin_package()
include_directories(${catkin_INCLUDE_DIRS})
add_executable(opencv_version_test src/opencv_version_test.cpp)
target_link_libraries(opencv_version_test ${catkin_LIBRARIES} ${OpenCV_LIBS})
그리고 opencv_version_test.cpp파일도 수정해준다.
#include <ros/ros.h>
#include <iostream>
#include "opencv2/opencv.hpp"
int main(int argc, char** argv) {
ros::init(argc, argv, "opencv_version_test");
ros::NodeHandle nh;
std::cout << "OpenCV version : " << CV_VERSION << std::endl;
return 0;
}
Build 진행
$ ~/catkin_ws_opencv_version
$ catkin build
잘 작동되는지 확인해보기 위해 아래 내용을 실행해보자.
$ roscore
$ rosrun opencv_version_test opencv_version_test
그럼 기본으로 할당된 경로에서 opencv 를 불러와 버전을 출력하게 된다.
이제 opencv 경로를 변경하여 다른 버전의 opencv를 사용하여 보자.
cmake_minimum_required(VERSION 3.1)
project(opencv_version_test)
## Compile as C++11, supported in ROS Kinetic and newer
# add_compile_options(-std=c++11)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED TRUE)
set(OpenCV_DIR /home/eh420/installation/OpenCV-master/lib/cmake/opencv4)
find_package(catkin REQUIRED COMPONENTS roscpp)
find_package(OpenCV REQUIRED)
catkin_package()
include_directories(${catkin_INCLUDE_DIRS})
add_executable(opencv_version_test src/opencv_version_test.cpp)
target_link_libraries(opencv_version_test ${catkin_LIBRARIES} ${OpenCV_LIBS})
위의 코드블럭에서 set(OpenCV_DIR /~~~) 을 통해 경로를 지정해주는데 여기는
해당 opencv 버전의 OpenCVConfig-version.cmake , OpenCVModules.cmake , OpenCVConfig.cmake , OpenCVModules-release.cmake 등의 파일이 존재하는 경로를 넣어주자.
그리고 다시 빌드
$ ~/catkin_ws_opencv_version
$ catkin build
그리고 실행
// terminal_1
$ roscore
// terminal_2
$ rosrun opencv_version_test opencv_version_test
그럼 다른 버전의 opencv가 적용되어 버전이 바뀐것을 확인할 수 있다.