Ubuntu 16.04 + ROS Kinetic + opencv4.2.0
因为工作需要,要在Ubuntu 16.04 + ROS Kinetic配置下使用高版本的opencv。但是ROS Kinetic自带的opencv版本只有3.3.1,因此需要自行安装高版本的opencv,然后进行相关配置。
配置过程比较艰难,搞了半天,因此记录一下这个过程。
该过程主要分为以下3个步骤:
- 下载安装
opencv-4.2.0
以及opencv_contrib-4.2.0
(后者根据需要选择是否安装,因为我需要使用opencv内置的跟踪器,因此需要安装这个包。另外,这两个包的版本必须一致); - 配置
cv_bridge
文件,让它调用新安装的opencv版本,而不是ROS自带的版本; - 配置自己创建的ROS功能包的
CMakeLists.txt
,然后用catkin_make
编译即可。
1.安装opencv4.2.0
该过程我主要参考了以下两篇文章:
- Ubuntu16.04编译安装opencv4.2.0_m0_53913604的博客-CSDN博客
- 【opencv学习之四十五】Ubuntu16安装OpenCV4.2_abcvincent的博客-CSDN博客
安装流程与以上两篇文章一致,遇到的问题也是一样的,就是在使用cmake
配置时因为网络问题无法正常下载需要的文件。解决方法是直接将需要的文件下载到本地即可,至于需要下载哪些文件以及下载地址,可以查看/opencv-4.2.0/build/CMakeDownloadLog.txt
,查找关键字"missing"中出现的文件即可。我统计了一下,总共缺少以下文件:
- [opencv-4.2.0]
ippicv_2019_lnx_intel64_general_20180723.tgz
- [opencv_contrib-4.2.0]
将下载的文件放在指定文件夹内即可,然后使用cmake
重新配置就好了。这部分文件我分享了百度网盘,有需要的可以自行下载。
链接:https://pan.baidu.com/s/14LPvzrJjIDw4z6wfdXR-Gg
提取码:hjm9
2.配置cv_bridge文件
这部分内容主要参考:
- ROS Kinetic + Ubuntu 16.04 opencv4自带的yolov3配置_heiyumiao的博客-CSDN博客
- 解决Ubuntu环境下ROS Kinetic中的cv_bridge和自己安装OpenCV 2.4.xx兼容性笔记_bigdog_1027的博客-CSDN博客_cv_bridge安装
第二篇博客过于复杂了,其实只要像第一篇博客一样修改很少的部分就可以了。
在/opt/ros/kinetic/share/cv_bridge/cmake
路径下找到cv_bridgeConfig.cmake
文件,需要修改第94-96行的内容。修改如下:
# if(NOT "include;/opt/ros/kinetic/include/opencv-3.3.1-dev;/opt/ros/kinetic/include/opencv-3.3.1-dev/opencv " STREQUAL " ")
# set(cv_bridge_INCLUDE_DIRS "")
# set(_include_dirs "include;/opt/ros/kinetic/include/opencv-3.3.1-dev;/opt/ros/kinetic/include/opencv-3.3.1-dev/opencv")
if(NOT "include;/usr/local/include/opencv4;/usr/local/include/opencv4/opencv2 " STREQUAL " ")
set(cv_bridge_INCLUDE_DIRS "")
set(_include_dirs "include;/usr/local/include/opencv4;/usr/local/include/opencv4/opencv2")
3.配置功能包下的CMakeLists.txt
这部分内容参考以下博客的最后一部分:
修改后的CMakeLists.txt文件如下:
cmake_minimum_required(VERSION 3.0.2)
project(robot_tracker_ros)
## Compile as C++11, supported in ROS Kinetic and newer
add_compile_options(-std=c++11)
## Find catkin macros and libraries
## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz)
## is used, also find other catkin packages
set(OpenCV_DIR /usr/local/include/opencv4)
find_package(catkin REQUIRED COMPONENTS
cv_bridge
image_transport
roscpp
rospy
sensor_msgs
std_msgs
)
find_package(OpenCV 4 REQUIRED)
message(STATUS " OpenCV library status:")
message(STATUS " config: ${OpenCV_DIR}")
message(STATUS " version: ${OpenCV_VERSION}")
message(STATUS " libraries: ${OpenCV_LIBS}")
message(STATUS " include path: ${OpenCV_INCLUDE_DIRS}")
...
###########
## Build ##
###########
## Specify additional locations of header files
## Your package locations should be listed before other locations
include_directories(
# include
${catkin_INCLUDE_DIRS}
${OpenCV_INCLUDE_DIRS}
)
...
add_executable(getImage src/getImage.cpp)
target_link_libraries(getImage ${catkin_LIBRARIES} ${OpenCV_LIBS})
...
以上就是全部内容了,这个过程真的太痛苦了。。。希望能帮到一些人吧。